การส่งแอปพลิเคชันจากเบื้องหน้าไปยังพื้นหลังต้องได้รับความร่วมมือจากทั้งเทอร์มินัลและเชลล์ เทอร์มินัลไม่สามารถทำได้โดยลำพังเนื่องจากเชลล์ต้องตั้งค่ากลุ่มกระบวนการพื้นหน้า เชลล์ไม่สามารถทำด้วยตัวเองได้เพราะเทอร์มินัลต้องดำเนินการกดปุ่ม (เชลล์ไม่ได้อยู่ในเบื้องหน้าดังนั้นจึงไม่สามารถรับการกดปุ่มได้)
การปิดอย่างใกล้ชิดคือการส่งแอปพลิเคชันไปยังพื้นหลังอย่างรวดเร็ว ท้ายที่สุดแล้วแอปพลิเคชั่นจะแชร์เวลา CPU กับผู้อื่นและการหยุดชั่วคราวสักสองสามร้อยวินาทีไม่น่าจะสำคัญ (มันใช้สำหรับแอปพลิเคชันแบบเรียลไทม์ดังนั้นตรวจสอบให้แน่ใจว่าได้เริ่มต้นด้วยแบ็คกราวน์) ฉันใช้เชลล์การเชื่อมสำหรับCtrl+ Zที่ส่งงานที่อยู่เบื้องหน้าไปยังพื้นหลัง ด้วยวิธีนี้การกดCtrl+ Z Ctrl+ Zส่งงานไปที่พื้นหลังด้วยเวลาพักงานน้อยที่สุด
นี่คือ zsh ของฉันผูกพันซึ่งยัง“พื้นหลัง” คำสั่งครึ่งพิมพ์เมื่อบรรทัดคำสั่งไม่ว่างเปล่า
fancy-ctrl-z () {
emulate -LR zsh
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
ในภาษาอังกฤษสำหรับผู้ที่ไม่ใช่ผู้ใช้ zsh ในผู้ชม:
หากคุณต้องการให้พื้นหลังทำงานโดยไม่คำนึงว่าบรรทัดคำสั่งว่างเปล่าหรือไม่:
function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_
ฉันไม่รู้ว่าคุณสามารถทำสิ่งเดียวกันนี้ได้ด้วยการทุบตี มันควรจะง่ายเหมือนbind -x '"\C-z": bg'
ยกเว้นว่า bash จะทิ้งอักขระ tty stop ไว้ดังนั้นจึงไม่ได้รับCtrl+ Zเป็นอินพุต