ถ้าฉันใช้คำสั่งในพื้นหลังด้วย&
เช่นนี้
sleep 2 &
เมื่อคำสั่งเสร็จสิ้นฉันจะได้รับ "เสร็จสิ้น" ฉันจะหลีกเลี่ยงการเห็นข้อความ "เสร็จสิ้น" ได้อย่างไร?
ถ้าฉันใช้คำสั่งในพื้นหลังด้วย&
เช่นนี้
sleep 2 &
เมื่อคำสั่งเสร็จสิ้นฉันจะได้รับ "เสร็จสิ้น" ฉันจะหลีกเลี่ยงการเห็นข้อความ "เสร็จสิ้น" ได้อย่างไร?
คำตอบ:
เรียกใช้งานเชลล์ในตัว:
$ set +m
สิ่งนี้ทำงานได้โดยการปิด"โหมดมอนิเตอร์"ดังนั้นเชลล์จะไม่รายงานการยกเลิกงานพื้นหลัง
แม้ว่าการเรียกใช้คำสั่งใน subshell เช่น:
$ (sleep 2&)
... จะยังปิดการใช้งานข้อความเหตุผลเดียวที่มันทำงานเป็นเพราะโหมดจอภาพถูกเปิดใช้งานโดยเริ่มต้นเท่านั้นสำหรับเปลือกหอยแบบโต้ตอบ นั่นคือ subshell หลีกเลี่ยงข้อความโดยการเรียกใช้เปลือกพิเศษที่มี"set + m"โดยอัตโนมัติ
ฉันต้องการชี้แจงสองคำตอบก่อนหน้านี้ให้ชัดเจน หากสิ่งที่คุณต้องการคือไม่เคยเห็นข้อความเสร็จสิ้นจากคำสั่งใด ๆ ในเปลือกของคุณset +m
เป็นวิธีที่จะไป เพียงวางไว้ใน. โปรไฟล์ของคุณและ / หรือ. bashrc และทำได้ อย่างไรก็ตามโปรดทราบว่าหากคุณพิมพ์สิ่งนี้:
set +m
sleep 2 &
set -m
และการนอนหลับจะสิ้นสุดลงหลังจากรอบสุดท้ายset -m
คุณจะยังคงได้รับข้อความที่ทำเสร็จ
หากคุณต้องการปิดการใช้งานข้อความสำหรับการเรียกใช้คำสั่งเดียวเทคนิค subshell (sleep 2 &)
เป็นวิธีการที่จะไป
ในความซื่อสัตย์ทั้งหมดฉันรู้เพียงเท่านั้นset +m
ดังนั้น +1 กับ Wooble เพื่อให้ความกระจ่างแก่ฉัน อย่างไรก็ตามเป็นเรื่องที่ควรสังเกตว่าโซลูชันใดในสองวิธีที่คุณต้องการขึ้นอยู่กับสิ่งที่คุณพยายามทำ
หากไม่มีเชลล์ย่อยคุณสามารถทำสิ่งต่อไปนี้:
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
ตามคำตอบนี้
jobs
จะไม่แสดงอะไรเลย)