ความแตกต่างระหว่าง ^ C และ ^ D สำหรับเทอร์มินัล UNIX / Mac OS X คืออะไร?


61

เมื่อฉันพยายามที่จะหยุดบางสิ่งบางอย่างฉันใช้^Cและบางครั้ง^Dใน terminal

ความแตกต่างระหว่างสองคืออะไร ทำไมบางโปรแกรมไม่ตอบสนองต่อแต่^C ^Dทำไม Terminal.app เพียงแค่หยุดทำงานเมื่อฉันใช้^D?


FYI: ดูหน้า Wikipedia สำหรับ: END of TEXTตัวละคร U + 0003 ที่ผลิตโดย Control + C และ End of TransmISSION character U + 0004 ที่ผลิตโดย Control + D
Basil Bourque

คำตอบ:


60

CtrlCบอกให้เทอร์มินัลส่ง a SIGINTไปยังกระบวนการพื้นหน้าปัจจุบันซึ่งโดยค่าเริ่มต้นแปลเป็นการสิ้นสุดการสมัคร CtrlDบอกเทอร์มินัลว่าควรลงทะเบียน EOF ในอินพุตมาตรฐานซึ่ง bash ตีความว่าเป็นความปรารถนาที่จะออก


62

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คำสั่ง บางโปรแกรมโดยเฉพาะอย่างยิ่งโปรแกรมเต็มหน้าจอที่มีการผูกคีย์ปิดใช้งาน


การแก้ไขเล็กน้อย: Control-Z ส่งสัญญาณ TSTP (เทอร์มินัลสต็อป) สิ่งนี้สามารถถูกดักจับหรือละเว้นโดยกระบวนการในขณะที่สัญญาณ STOP ไม่สามารถ
Chris หน้า

ต้องการสิ่งนี้! มันติดอยู่และฉันไม่สามารถออกไปได้
ahnbizcad

1
เพียงข้อเสนอแนะเกี่ยวกับ CTRL-D: มันหมายถึง "ล้างข้อมูลที่ฉันพิมพ์ลงไป" และถ้าบรรทัดว่างเปล่าแล้ว read () จะส่งกลับด้วยศูนย์และนั่นแปลว่า "สิ้นสุดไฟล์"
ลูก้า

นี่เป็นข้อมูลที่สำคัญและเป็นประโยชน์ ขอบคุณสำหรับคำอธิบายที่ครอบคลุมและชัดเจน
iono

เพียงแค่อยากรู้ว่าทำไมไพ ธ อน progam ที่ทำงานในเชลล์ไม่ได้ออกด้วย ctrl + c แทนที่จะเป็นพรอมต์KeyboardInterrupt? มันเลิกกับ ctrl + d (ถ้าที่จุดเริ่มต้นของบรรทัด) และด้วย ctrl + \
Rick

2

เพิ่มไปยัง 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)


ฉันขอขอบคุณคำตอบนี้ อย่างไรก็ตามฉันพบข้อผิดพลาดบางอย่างเมื่อลองใช้ด้วยตนเอง ขณะที่ ssh'ed เป็นเครื่องรีโมตและรันกระบวนการไพ ธ อน Ctrl + D ออกจากไพ ธ อนและพาฉันกลับไปที่พรอมต์ของรีโมตเครื่องมันไม่ได้ออกจากเครื่อง นอกจากนี้ปุ่ม Delete ไม่ทำงานเหมือนกับ Ctrl + D ในทุกกรณีใช้งาน python ที่พร้อมต์รีโมตหรือที่พร้อมต์โลคัลของฉัน ดูเหมือนว่ามันจะไม่ทำอะไรเลยยกเว้นลบตัวอักษรในขณะที่พิมพ์ในหลามแน่นอน อย่างไรก็ตาม Ctrl + D ทำหน้าที่เป็นปุ่มลบเมื่อพิมพ์มันจะลบอักขระ
Stack Underflow

1
น่าสนใจฉันคิดว่ามันอาจขึ้นอยู่กับชนิดของเชลล์ที่คุณใช้ (bash, ksh ฯลฯ )
Siddhartha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.