เมื่อฉันพยายามที่จะหยุดบางสิ่งบางอย่างฉันใช้^C
และบางครั้ง^D
ใน terminal
ความแตกต่างระหว่างสองคืออะไร ทำไมบางโปรแกรมไม่ตอบสนองต่อแต่^C
^D
ทำไม Terminal.app เพียงแค่หยุดทำงานเมื่อฉันใช้^D
?
เมื่อฉันพยายามที่จะหยุดบางสิ่งบางอย่างฉันใช้^C
และบางครั้ง^D
ใน terminal
ความแตกต่างระหว่างสองคืออะไร ทำไมบางโปรแกรมไม่ตอบสนองต่อแต่^C
^D
ทำไม Terminal.app เพียงแค่หยุดทำงานเมื่อฉันใช้^D
?
คำตอบ:
CtrlCบอกให้เทอร์มินัลส่ง a SIGINT
ไปยังกระบวนการพื้นหน้าปัจจุบันซึ่งโดยค่าเริ่มต้นแปลเป็นการสิ้นสุดการสมัคร CtrlDบอกเทอร์มินัลว่าควรลงทะเบียน EOF ในอินพุตมาตรฐานซึ่ง bash ตีความว่าเป็นความปรารถนาที่จะออก
Ctrl+ D( ^D
) หมายถึงจุดสิ้นสุดของแฟ้ม ใช้งานได้เฉพาะที่จุดเริ่มต้นของบรรทัด (ฉันลดความซับซ้อนลงเล็กน้อย) และไม่มีผลใด ๆ หากโปรแกรมไม่ได้อ่านอินพุตจากเทอร์มินัล ในการทดสอบของคุณ^D
บอกเชลล์ว่าคุณไม่ได้พิมพ์คำสั่งเพิ่มเติมอีกแล้วจึงออก เทอร์มินัลออกจากแล้วเนื่องจากโปรแกรมย่อยสิ้นสุดลง
Ctrl+ C( ^C
) หมายถึง "ขัดจังหวะ" เช่นหยุดสิ่งที่คุณทำ ในทางเทคนิคแล้วการกด^C
ส่งสัญญาณ INTซึ่งโดยปกติแล้วจะยุติแอปพลิเคชั่น แต่ในหลาย ๆ โปรแกรมหมายถึงกลับไปที่ระดับสูงสุด (เช่นในเชลล์ให้หยุดพิมพ์บรรทัดคำสั่งและกลับไปที่พรอมต์เก่า)
หากโปรแกรมไม่ตอบสนอง^C
คุณสามารถลองCtrl+ \( ^\
) สิ่งนี้จะส่งสัญญาณ QUITซึ่งโดยปกติแล้วจะยุติแอปพลิเคชั่นและโปรแกรมไม่ได้ขัดขวางหลายโปรแกรม
ปุ่มอื่นที่ส่งสัญญาณคือCtrl+ Z( ^Z
) มันส่งสัญญาณ TSTPซึ่งหยุดโปรแกรมที่ทำงานอยู่เบื้องหน้า (TSTP ย่อมาจาก“ terminal stop” ซึ่งคล้ายกับSTOPแต่สามารถละเว้น TSTP ได้ในขณะที่ STOP ไม่สามารถทำได้) จากเชลล์คุณสามารถเรียกใช้การทำงานของโปรแกรมนั้นด้วยfg
คำสั่ง (ดำเนินการต่อในเบื้องหน้า) หรือbg
คำสั่ง พื้นหลัง).
คีย์เหล่านี้ทั้งหมดสามารถเปลี่ยนแปลงได้ด้วยstty
คำสั่ง บางโปรแกรมโดยเฉพาะอย่างยิ่งโปรแกรมเต็มหน้าจอที่มีการผูกคีย์ปิดใช้งาน
KeyboardInterrupt
? มันเลิกกับ ctrl + d (ถ้าที่จุดเริ่มต้นของบรรทัด) และด้วย ctrl + \
เพิ่มไปยัง 2 คำตอบที่ดีจริง ๆ ข้างต้นนี่คือตัวอย่าง:
ถ้าคุณพิมพ์python
เชลล์มันจะนำคุณเข้าสู่พรอมต์ >>> ของงูหลาม
ตอนนี้ถ้าคุณโดนCtrl+C
มันจะพูดKeyboardInterrupt
และอยู่ใน >>>
หากคุณเข้าสู่ for for loop เช่นโดยพิมพ์for x in (text):
รอให้คุณพิมพ์เพิ่มเติมโดยแสดงพร้อมท์ ... ถ้าคุณกดCtrl+C
ตอนนี้มันจะออกจากคำสั่ง for และกลับไปที่ >>> พร้อมท์
หากคุณกดCtrl+D
ณ จุดใดก็ตามไม่ว่าจะเป็น >>> หรือ ... มันจะออกจากพรอมต์หลามและกลับสู่เชลล์เดิม
ในทำนองเดียวกันหาก ssh'ed ไปยังเครื่องอื่น a Ctrl+C
จะยกเลิกคำสั่งใด ๆ ที่มีอยู่Ctrl+D
จะทำและออกจากเครื่องเช่นกัน (เช่นเดียวกับที่Delete
สำคัญคือทำCtrl+D
)