ฉันจะทำ Ctrl-Z และ bg ในหนึ่งปุ่มกดเพื่อให้กระบวนการดำเนินการต่อในพื้นหลังได้อย่างไร


24

ฉันทำตามรูปแบบนี้ของการหยุดงานแล้วปล่อยให้มันดำเนินการต่อบ่อยเกินไปกับCtrl-Z bgลำดับ

ฉันสงสัยว่าจะมีวิธีใดในการบีบอัดข้อมูลนั้นไปยังปุ่มกดเดี่ยวหรือไม่

เปลือกของฉันคือ zsh


ฉันอยากจะบอกว่าอาจเป็นรหัสยาก แต่ฉันไม่ได้ 100%
ชาดแฮร์ริสัน

แน่นอน แต่ฉันได้พบวิธีแก้ปัญหาที่ยอดเยี่ยมแล้วขอบคุณsuperuser.com/a/161922/35223
Evgeniy Dolzhenko

คำตอบ:


24

Ctrl+ Zลำดับจะถูกจัดการโดย terminal ไม่ได้โดยเปลือก (พื้นหลังที่มีประโยชน์: อะไรคือความแตกต่างที่แน่นอนระหว่าง 'terminal', 'shell', 'tty' และ 'console'? )

เพียง แต่มีขนาดเล็กชุดที่ไม่ใช่ขยายของฟังก์ชั่นสามารถผูกไว้กับกุญแจสำคัญในขั้ว คุณสามารถปรับแต่งปุ่มที่ผูกไว้กับฟังก์ชั่นเหล่านี้ แต่ไม่สามารถเพิ่มฟังก์ชั่นอื่นได้ ฟังก์ชั่นเหล่านี้แบ่งออกเป็นสามประเภท:

  • Command line edition ในโปรแกรมที่ไม่มีตัวเอง (โหมด canonical หรือที่เรียกว่าโหมดสุก (ตรงกันข้ามกับโหมด raw) ซึ่งคุณไม่ค่อยได้ใช้ในทางปฏิบัติ): end of file ( 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

Gilles นี่เป็นคำตอบที่สมบูรณ์แบบให้การศึกษาและมีน้ำใจอย่างไม่น่าเชื่อฉันไม่สามารถคาดหวังได้! ขอบคุณมาก!
Evgeniy Dolzhenko

2

^ z ^ z เช่น zsh ด้านบนเป็นไปได้ใน bash แม้ว่ามันจะเป็น kludgy เล็กน้อยและฉันไม่ได้เรียกใช้งานเป็นเวลานาน:

  • ใน. inputrc ของคุณมีการแมป "\C-z": "bg\n"
  • ในตัวแปรทุบตี PS0 ประกอบด้วย `$ (stty susp ^ z) '
  • ในตัวแปรทุบตี PROMPT_COMMAND ได้แก่ 'stty susp ^ @'

ดังนั้น ^ z สำหรับการหยุดชั่วคราวถูกเปิดใช้งานเมื่อคำสั่งรันจากนั้นปิดสำหรับพรอมต์ bash


1

พบวิธีแก้ปัญหาไม่ใช่สิ่งที่ฉันต้องการ แต่สาปให้ปิดจากที่นี่https://superuser.com/a/161922/35223

บนบรรทัดคำสั่งที่ว่างเปล่ารัน bg (เพื่อให้ Ctrl + Z Ctrl + Z หยุดโปรแกรมชั่วคราวและกลับสู่พื้นหลังในทันที)


ฉันจะทราบว่าสิ่งนี้ต้องมี zsh; ไม่รองรับการทุบตี (นอกกรอบอยู่ดี)
Kevin M

@KevinM คุณสามารถเขียนฟังก์ชันแบบแอนะล็อกใน bash (อย่างน้อยรุ่นพื้นฐานที่Ctrl+Zเรียกbgฉันไม่แน่ใจเกี่ยวกับการตรวจสอบสายอินพุตที่ไม่ว่าง)
Gilles

0

คำสั่งเหล่านี้เป็นสิ่งที่คุณต้องการเรียกใช้ในเบื้องหน้าในตอนแรกแล้วเปลี่ยนเป็นพื้นหลังหรือไม่ ฉันไม่รู้ว่ามีวิธีที่ง่ายกว่านี้หรือไม่ แต่ถ้าคุณต้องการเรียกใช้คำสั่งที่อยู่ในพื้นหลังเพื่อเริ่มต้นคุณสามารถเพิ่มเครื่องหมายและท้ายบรรทัดได้ เช่นping google.com &จะเริ่มกระตุกในพื้นหลัง fgคุณจะไม่สามารถโต้ตอบกับมันจนกว่าคุณพิมพ์


1
ขอบคุณปัญหาคือบางครั้งคุณไม่ทราบว่าต้องใช้เวลาในการรันคำสั่งนานเท่าไรดังนั้นคุณจึงทำงานได้แบบโต้ตอบและตระหนักว่าคุณควรปล่อยให้มันทำงานบนพื้นหลังต่อไป คำตอบที่ยอมรับใช้งานได้มหัศจรรย์สำหรับฉันใช้มันทุกวัน!
Evgeniy Dolzhenko

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