ฉันทำตามรูปแบบนี้ของการหยุดงานแล้วปล่อยให้มันดำเนินการต่อบ่อยเกินไปกับCtrl-Z bgลำดับ
ฉันสงสัยว่าจะมีวิธีใดในการบีบอัดข้อมูลนั้นไปยังปุ่มกดเดี่ยวหรือไม่
เปลือกของฉันคือ zsh
ฉันทำตามรูปแบบนี้ของการหยุดงานแล้วปล่อยให้มันดำเนินการต่อบ่อยเกินไปกับCtrl-Z bgลำดับ
ฉันสงสัยว่าจะมีวิธีใดในการบีบอัดข้อมูลนั้นไปยังปุ่มกดเดี่ยวหรือไม่
เปลือกของฉันคือ zsh
คำตอบ:
Ctrl+ Zลำดับจะถูกจัดการโดย terminal ไม่ได้โดยเปลือก (พื้นหลังที่มีประโยชน์: อะไรคือความแตกต่างที่แน่นอนระหว่าง 'terminal', 'shell', 'tty' และ 'console'? )
เพียง แต่มีขนาดเล็กชุดที่ไม่ใช่ขยายของฟังก์ชั่นสามารถผูกไว้กับกุญแจสำคัญในขั้ว คุณสามารถปรับแต่งปุ่มที่ผูกไว้กับฟังก์ชั่นเหล่านี้ แต่ไม่สามารถเพิ่มฟังก์ชั่นอื่นได้ ฟังก์ชั่นเหล่านี้แบ่งออกเป็นสามประเภท:
eof
, Ctrl+ D), end of line ( eol
, Ctrl+ M), ลบอักขระทางซ้าย ( erase
, Ctrl+ H), ลบคำที่เหลือ ( werase
, Ctrl+ W), ลบบรรทัด ( kill
, Ctrl+ U)stop
( Ctrl+ S), start
( Ctrl+ Q) มีประโยชน์เฉพาะในอาคารผู้โดยสารอนุกรมที่มีอักขระเก่าเมื่อเทอร์มินัลไม่สามารถติดต่อกับคอมพิวเตอร์หรือในทางกลับกันintr
, Ctrl+ C), บังคับออกจาก ( quit
, Ctrl+ \), ระงับ ( Ctrl+ Z)บางระบบรวมถึงลินุกซ์ขยายรายการออกไป แต่ฉันไม่เคยเห็นระบบที่รวมพื้นหลังไว้ด้วย โปรดทราบว่าจะรองรับทั้งในไดรเวอร์เทอร์มินัลในเคอร์เนลและในเทอร์มินัลอีมูเลเตอร์ ดังนั้นคุณต้องทำกับ suspend ซึ่งจะส่งสัญญาณเบื้องหน้าสัญญาณSIGTSTP สิ่งนี้ทริกเกอร์SIGCHLDในกระบวนการหลักของหัวหน้างานเบื้องหน้าซึ่งโดยปกติจะเป็นเชลล์ เมื่อเชลล์ได้รับ SIGCHLD มันจะโทรwaitpid
หาว่าทำไมมันถึงได้รับแจ้งและเมื่อตรวจพบว่ามีการหยุดงานพื้นหลังมันจะแสดงการแจ้งเตือน (เช่น[1] + 12345 suspended mycommand
) และพร้อมท์ใหม่
คุณสามารถตั้งโปรแกรมเชลล์เพื่อส่งSIGCONT
สัญญาณไปยังงานเบื้องหน้า ฉันไม่คิดว่า zsh มีเบ็ดสำหรับสิ่งนั้นคุณจะต้องแก้ไขซอร์สโค้ด และไม่มีทางที่ zsh จะรู้ว่าคุณตั้งใจจะขัดจังหวะโปรแกรม (อุ๊ปส์โปรแกรมนี้อาจทำสิ่งผิดพลาดให้ฉันหยุดชั่วคราวในขณะที่ฉันเรียงลำดับ) หรือทำให้พื้นหลัง
สิ่งที่ฉันทำคือการตั้งค่าลำดับCtrl+ Zปุ่มใน zsh เป็นพื้นหลังงานปัจจุบัน ( %%
) วิธีการที่ฉันสามารถส่งงานเบื้องหน้าไปที่พื้นหลังโดยการกดCtrl+ +Z Ctrl Zขณะที่ฉันอยู่ที่นี่ฉันทำCtrl+ Zทำอย่างอื่นที่มีประโยชน์เมื่อบรรทัดอินพุตปัจจุบันไม่ว่างเปล่า (ดังนั้นฉันจึงไม่เพิ่งกลับมาจาก subprocess):“ ระงับ” อินพุตบรรทัดปัจจุบันทำให้ฉันพิมพ์คำสั่งอื่นได้ หลังจากนั้นบรรทัดที่ถูกขัดจังหวะจะถูกส่งกลับเข้าไปในบัฟเฟอร์อินพุต
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
^ z ^ z เช่น zsh ด้านบนเป็นไปได้ใน bash แม้ว่ามันจะเป็น kludgy เล็กน้อยและฉันไม่ได้เรียกใช้งานเป็นเวลานาน:
"\C-z": "bg\n"
ดังนั้น ^ z สำหรับการหยุดชั่วคราวถูกเปิดใช้งานเมื่อคำสั่งรันจากนั้นปิดสำหรับพรอมต์ bash
พบวิธีแก้ปัญหาไม่ใช่สิ่งที่ฉันต้องการ แต่สาปให้ปิดจากที่นี่https://superuser.com/a/161922/35223
บนบรรทัดคำสั่งที่ว่างเปล่ารัน bg (เพื่อให้ Ctrl + Z Ctrl + Z หยุดโปรแกรมชั่วคราวและกลับสู่พื้นหลังในทันที)
Ctrl+Z
เรียกbg
ฉันไม่แน่ใจเกี่ยวกับการตรวจสอบสายอินพุตที่ไม่ว่าง)
คำสั่งเหล่านี้เป็นสิ่งที่คุณต้องการเรียกใช้ในเบื้องหน้าในตอนแรกแล้วเปลี่ยนเป็นพื้นหลังหรือไม่ ฉันไม่รู้ว่ามีวิธีที่ง่ายกว่านี้หรือไม่ แต่ถ้าคุณต้องการเรียกใช้คำสั่งที่อยู่ในพื้นหลังเพื่อเริ่มต้นคุณสามารถเพิ่มเครื่องหมายและท้ายบรรทัดได้ เช่นping google.com &
จะเริ่มกระตุกในพื้นหลัง fg
คุณจะไม่สามารถโต้ตอบกับมันจนกว่าคุณพิมพ์