การป้องกันการทุบตีจากการแสดง“ เสร็จสิ้น” เมื่อคำสั่งพื้นหลังเสร็จสิ้นการดำเนินการ


34

ถ้าฉันใช้คำสั่งในพื้นหลังด้วย&เช่นนี้

sleep 2 &

เมื่อคำสั่งเสร็จสิ้นฉันจะได้รับ "เสร็จสิ้น" ฉันจะหลีกเลี่ยงการเห็นข้อความ "เสร็จสิ้น" ได้อย่างไร?

คำตอบ:


34

เรียกใช้คำสั่งในเชลล์ย่อย:

(sleep 2 &)

โปรดทราบว่าด้วยการใช้สิ่งนี้คุณจะไม่สามารถควบคุมงานใน caller shell ได้ ( jobsจะไม่แสดงอะไรเลย)
mighq

36

เรียกใช้งานเชลล์ในตัว:

$ set +m

สิ่งนี้ทำงานได้โดยการปิด"โหมดมอนิเตอร์"ดังนั้นเชลล์จะไม่รายงานการยกเลิกงานพื้นหลัง

แม้ว่าการเรียกใช้คำสั่งใน subshell เช่น:

$ (sleep 2&)

... จะยังปิดการใช้งานข้อความเหตุผลเดียวที่มันทำงานเป็นเพราะโหมดจอภาพถูกเปิดใช้งานโดยเริ่มต้นเท่านั้นสำหรับเปลือกหอยแบบโต้ตอบ นั่นคือ subshell หลีกเลี่ยงข้อความโดยการเรียกใช้เปลือกพิเศษที่มี"set + m"โดยอัตโนมัติ


4
หนึ่งควรทราบว่าผลลัพธ์นี้ไม่ได้ดำเนินการโดยการนอนหลับ เปลือก bash ที่เพิ่งแจ้งให้คุณทราบเกี่ยวกับงานพื้นหลังเสร็จแล้ว
flolo

8

ฉันต้องการชี้แจงสองคำตอบก่อนหน้านี้ให้ชัดเจน หากสิ่งที่คุณต้องการคือไม่เคยเห็นข้อความเสร็จสิ้นจากคำสั่งใด ๆ ในเปลือกของคุณset +mเป็นวิธีที่จะไป เพียงวางไว้ใน. โปรไฟล์ของคุณและ / หรือ. bashrc และทำได้ อย่างไรก็ตามโปรดทราบว่าหากคุณพิมพ์สิ่งนี้:

set +m
sleep 2 &
set -m

และการนอนหลับจะสิ้นสุดลงหลังจากรอบสุดท้ายset -mคุณจะยังคงได้รับข้อความที่ทำเสร็จ

หากคุณต้องการปิดการใช้งานข้อความสำหรับการเรียกใช้คำสั่งเดียวเทคนิค subshell (sleep 2 &)เป็นวิธีการที่จะไป

ในความซื่อสัตย์ทั้งหมดฉันรู้เพียงเท่านั้นset +mดังนั้น +1 กับ Wooble เพื่อให้ความกระจ่างแก่ฉัน อย่างไรก็ตามเป็นเรื่องที่ควรสังเกตว่าโซลูชันใดในสองวิธีที่คุณต้องการขึ้นอยู่กับสิ่งที่คุณพยายามทำ


0

หากไม่มีเชลล์ย่อยคุณสามารถทำสิ่งต่อไปนี้:

silent_background() {
    { 2>&3 "$@"& } 3>&2 2>-
    disown &>/dev/null  # Close STD{OUT,ERR} for silence if job has already completed
}

silent_background sleep 5

ตามคำตอบนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.