ก่อนอื่น; เมื่อคุณเริ่มกระบวนการคุณสามารถแบ็คกราวน์ได้โดยหยุดขั้นตอนแรก (กดCtrl- Z) จากนั้นพิมพ์bg
เพื่อให้กระบวนการทำงานต่อในพื้นหลัง ตอนนี้เป็น "งาน" และstdout
/ stderr
/ stdin
ยังคงเชื่อมต่อกับเทอร์มินัลของคุณ
คุณสามารถเริ่มต้นกระบวนการเป็นพื้นหลังได้ทันทีโดยเพิ่ม "&" ต่อท้าย:
firefox &
หากต้องการเรียกใช้ในโหมดปิดเสียงเบื้องหลังให้ใช้สิ่งนี้:
firefox </dev/null &>/dev/null &
ข้อมูลเพิ่มเติมบางส่วน:
nohup
เป็นโปรแกรมที่คุณสามารถใช้เพื่อเรียกใช้แอปพลิเคชันของคุณโดยที่ stdout / stderr นั้นสามารถส่งไปยังไฟล์แทนและการปิดสคริปต์หลักจะไม่ส่งผลต่อลูก อย่างไรก็ตามคุณจำเป็นต้องมีความสุขุมในการใช้งานก่อนที่จะเริ่มแอปพลิเคชัน เนื่องจากวิธีการnohup
ทำงานคุณไม่สามารถนำไปใช้กับกระบวนการที่กำลังทำงานอยู่ได้
disown
เป็น bash ในตัวที่ลบงานเชลล์ออกจากรายการงานของเชลล์ สิ่งนี้โดยทั่วไปหมายถึงคือการที่คุณไม่สามารถใช้fg
, bg
เกี่ยวกับมันอีกต่อไป แต่ที่สำคัญกว่านั้นเมื่อคุณปิดเปลือกของคุณก็จะไม่แขวนหรือส่งSIGHUP
ไปยังเด็กคนนั้นอีกต่อไป ซึ่งแตกต่างจากnohup
, disown
ถูกนำมาใช้หลังจากกระบวนการที่ได้รับการเปิดตัวและ backgrounded
สิ่งที่คุณไม่สามารถทำได้คือเปลี่ยน stdout / stderr / stdin ของกระบวนการหลังจากเปิดใช้งานแล้ว อย่างน้อยไม่ได้มาจากเปลือก หากคุณเริ่มต้นกระบวนการของคุณและบอกว่า stdout นั้นเป็นเทอร์มินัลของคุณ (ซึ่งเป็นสิ่งที่คุณทำตามค่าเริ่มต้น) กระบวนการนั้นจะถูกกำหนดค่าให้ส่งออกไปยังเทอร์มินัลของคุณ เชลล์ของคุณไม่มีธุรกิจที่มีการตั้งค่า FD ของกระบวนการนั่นเป็นสิ่งที่กระบวนการจัดการเอง กระบวนการสามารถตัดสินใจได้ว่าจะปิด stdout / stderr / stdin หรือไม่ แต่คุณไม่สามารถใช้เชลล์เพื่อบังคับให้ทำเช่นนั้นได้
ในการจัดการผลลัพธ์ของกระบวนการพื้นหลังคุณมีตัวเลือกมากมายจากสคริปต์ "nohup" อาจเป็นคนแรกที่นึกถึง แต่สำหรับกระบวนการโต้ตอบที่คุณเริ่มต้น แต่ลืมที่จะเงียบ ( firefox < /dev/null &>/dev/null &
) คุณไม่สามารถทำอะไรได้มากจริงๆ
ผมขอแนะนำให้คุณได้รับ screen
GNU ด้วยหน้าจอคุณก็สามารถปิดการทำงานของคุณเปลือกเมื่อผลผลิตกระบวนการกลายเป็นรำคาญและเปิดใหม่ ( ^Ac
)
โอ้และอย่าใช้ " $@
" ในที่ที่คุณใช้อยู่
$@
หมายความว่า$1
, $2
, $3
... ซึ่งจะเปิดคำสั่งของคุณเป็น:
gnome-terminal -e "vim $1" "$2" "$3" ...
นั่นอาจไม่ใช่สิ่งที่คุณต้องการเพราะ -e รับเพียงหนึ่งอาร์กิวเมนต์เท่านั้น ใช้$1
เพื่อแสดงว่าสคริปต์ของคุณสามารถจัดการกับอาร์กิวเมนต์ได้เพียงหนึ่งข้อเท่านั้น
เป็นการยากที่จะให้อาร์กิวเมนต์หลายตัวทำงานอย่างถูกต้องในสถานการณ์ที่คุณให้ (กับgnome-terminal -e
) เพราะ-e
ใช้อาร์กิวเมนต์เพียงตัวเดียวเท่านั้นซึ่งเป็นสตริงคำสั่งเชลล์ คุณต้องเข้ารหัสข้อโต้แย้งของคุณเป็นหนึ่ง วิธีที่ดีที่สุดและแข็งแกร่งที่สุด แต่ค่อนข้างมีลักษณะเป็น cludgy:
gnome-terminal -e "vim $(printf "%q " "$@")"