CTRL + 4 (และ CTRL + \) ทำอะไรในทุบตี?


22

ฉันเพิ่งค้นพบโดยบังเอิญว่าCTRL+ 4 ปิดโปรแกรมที่อ่านstdinอินพุตจากบรรทัดคำสั่ง

นี่คือลักษณะเมื่อฉันพิมพ์CTRL+ 4หรือCTRL+ / ลงในโปรแกรมที่อ่านstdin

$ cat
wefwef
wefwef
^\Quit
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
^\Quit
$

ฉัน^\Quitปรากฏขึ้นจากนั้นโปรแกรมก็ปิด ความแตกต่างของสิ่งนี้เมื่อเทียบกับการใช้^Cหรือ^D? อะไร^\Quitทำอย่างไร

แก้ไข : พบว่าCTRL+ \ทำสิ่งเดียวกันมาก

คำตอบ:


37

Ctrl + 4 ส่ง ^ \

เทอร์มินัลส่งอักขระ (หรือมากกว่าแม่นยำ) ไม่ใช่คีย์ เมื่อกดปุ่มที่แสดงถึงอักขระที่พิมพ์ได้เทอร์มินัลจะส่งอักขระนั้นไปยังแอปพลิเคชัน ปุ่มฟังก์ชั่นส่วนใหญ่จะถูกเข้ารหัสเป็น escape sequences: ลำดับของตัวอักษรที่ขึ้นต้นด้วยหมายเลขตัวอักษร 27 keychords บางอันของ form Ctrl+ characterและ function keys ไม่กี่อันถูกส่งไปเป็นตัวควบคุม - ในชุดอักขระ ASCIIซึ่งคอมพิวเตอร์สมัยใหม่ทั้งหมด ใช้เป็นพื้นฐาน (Unicode, ISO ละตินnฯลฯ เป็น supersets ทั้งหมดของ ASCII), 33 อักขระเป็นอักขระควบคุม: อักขระหมายเลข 0 ถึง 31 และ 127 อักขระควบคุมไม่สามารถพิมพ์ได้ แต่มีวัตถุประสงค์เพื่อให้มีผลในแอปพลิเคชัน ตัวอย่างเช่นอักขระ 10 ซึ่งเป็น Control-J (เขียนโดยทั่วไป ^ J) เป็นอักขระขึ้นบรรทัดใหม่ดังนั้นเมื่อเทอร์มินัลแสดงอักขระนั้นมันจะย้ายเคอร์เซอร์ไปที่บรรทัดถัดไปแทนที่จะแสดงสัญลักษณ์ อักขระ escape เองคืออักขระควบคุม ^ [(ค่า 27)

มีอักขระควบคุมไม่เพียงพอที่จะครอบคลุมCtrl+ characterkeychords ทั้งหมด เฉพาะตัวอักษรและตัวอักษรเท่านั้นที่@[\]^_?มีตัวควบคุมที่เกี่ยวข้อง เมื่อคุณกดCtrl+ 4หรือCtrl+ $(ซึ่งฉันคิดว่าเป็นCtrl+ Shift+ 4) เครื่องจะต้องเลือกสิ่งที่จะส่ง ขึ้นอยู่กับเทอร์มินัลและการกำหนดค่ามีความเป็นไปได้หลายประการ:

  • ขั้วละเว้นการCtrlปรับปรุงและส่งตัวอักษรหรือ4$
  • เทอร์มินัลส่งลำดับ escape ที่เข้ารหัสคีย์และตัวดัดแปลงที่ถูกกด
  • เทอร์มินัลส่งอักขระควบคุมอื่น ๆ

เทอร์มินัลหลายตัวควบคุมการส่งสำหรับบางคีย์ในแถวหลัก

  • Ctrl+ 2→ ^ @
  • Ctrl+ 3→ ^ [
  • Ctrl+ 4→ ^ \
  • Ctrl+ 5→ ^]
  • Ctrl+ 6→ ^^
  • Ctrl+ 7→ ^ _
  • Ctrl+ 8→ ^?

ฉันไม่รู้ว่าการประชุมนี้เกิดขึ้นที่ไหน

Ctrl+ |ส่งอักขระตัวเดียวกันเพราะมันเป็นCtrl+ Shift+ \และเทอร์มินัลจะส่ง ^ \ ไม่ว่าจะกดแป้น Shift หรือไม่

^ \ ออก

เทอร์มินัลเอง (แม่นยำยิ่งขึ้นการสนับสนุนเทอร์มินัลทั่วไปในเคอร์เนล) ตีความอักขระควบคุมบางตัวเป็นพิเศษ การตีความนี้สามารถกำหนดค่าเพื่อแมปอักขระที่แตกต่างกันหรือปิดโดยแอปพลิเคชันที่ต้องการประมวลผลอักขระด้วยตนเอง หนึ่งการตีความที่รู้จักกันดีคือ ^ M อักขระที่ส่งโดยReturnคีย์ส่งบรรทัดปัจจุบันไปยังแอปพลิเคชันหากเทอร์มินัลอยู่ในโหมดสุกซึ่งแอปพลิเคชันรับอินพุตบรรทัดต่อบรรทัด

อักขระสองสามตัวส่งสัญญาณไปยังแอปพลิเคชันในเบื้องหน้า ^ C ส่งสัญญาณขัดจังหวะ (SIGINT) ซึ่งบอกให้แอปพลิเคชันตามปกติหยุดการทำงานและอ่านคำสั่งถัดไปของผู้ใช้ แอปพลิเคชันที่ไม่ใช่แบบโต้ตอบมักจะออกจาก ^ \ ส่งสัญญาณเลิก (SIGQUIT) ซึ่งบอกให้แอปพลิเคชันตามปกติออกโดยเร็วที่สุดโดยไม่ต้องบันทึกอะไรเลย แอปพลิเคชั่นจำนวนมากไม่ได้แทนที่การทำงานเริ่มต้นซึ่งเป็นการฆ่าแอปพลิเคชันทันที ดังนั้นเมื่อคุณกดCtrl+ 4(หรืออะไรก็ตามที่ส่งอักขระ ^ \) ในcatหรือbcไม่แทนที่พฤติกรรมเริ่มต้นแอปพลิเคชันจะถูกฆ่า

เทอร์มินัลเองพิมพ์^\ส่วนของข้อความ: มันเป็นภาพที่แสดงให้เห็นถึงตัวละครที่คุณพิมพ์และเทอร์มินัลอยู่ในโหมดสุกและเปิด echo (ตัวอักษรจะปรากฏขึ้นโดยเทอร์มินัลทันทีที่คุณพิมพ์ โหมดที่ไม่ใช่เสียงสะท้อนซึ่งตัวละครจะถูกส่งไปยังแอปพลิเคชั่นเท่านั้นซึ่งอาจเลือกหรือไม่แสดงก็ได้) Quitส่วนหนึ่งมาจากการทุบตีมันสังเกตเห็นว่ากระบวนการของเด็กเสียชีวิตจากการเลิกสัญญาณและที่ทางของการแจ้งให้คุณทราบ

เชลล์จัดการสัญญาณทั่วไปทั้งหมดดังนั้นหากคุณพิมพ์ ^ \ ในเชลล์คุณจะไม่ฆ่าเซสชันคุณเพิ่งได้รับพรอมต์ใหม่เหมือนกับ ^ C

คุณสามารถเล่นกับการตั้งค่าขั้วด้วยsttyคำสั่ง

¹ และสร้างการถ่ายโอนข้อมูลหลักแบบดั้งเดิมแต่หลาย ๆ ระบบปิดใช้งานโดยค่าเริ่มต้นในปัจจุบัน


SIGINT ฆ่ากลุ่มกระบวนการพื้นหน้าและ SIGQUIT ฆ่ามันด้วยการถ่ายโอนข้อมูลหลัก สัญญาณทั้งสองสามารถจัดการได้ ผมไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดยการอ่านคำสั่งต่อไป ระบบไม่ปิดใช้งานการถ่ายโอนข้อมูลหลักนอกเหนือจากการตั้งค่าขีด จำกัด coredumpsize เริ่มต้นที่ 0 (ไม่ใช่ฮาร์ดไดรฟ์คุณโดยทั่วไปสามารถเพิ่มได้)
Stéphane Chazelas

@ StéphaneChazelasในโปรแกรมที่ดำเนินการโต้ตอบกับผู้ใช้ความหมายปกติของ SIGINT คือการยกเลิกคำสั่งผู้ใช้ปัจจุบันและอนุญาตให้ผู้ใช้โต้ตอบกับโปรแกรมเช่นกลับไปที่ลูปคำสั่งหลัก ในทางกลับกันฉันจำไม่ได้ว่าเห็นโปรแกรมที่ SIGQUIT ไม่ออก (ยกเว้นข้อบกพร่องในตัวจัดการสัญญาณ) วิธีที่หลาย ๆ ระบบปิดการใช้งานการถ่ายโอนข้อมูลหลักโดยค่าเริ่มต้นคือการตั้งค่าการ จำกัด ขนาดการถ่ายโอนข้อมูลหลักเป็น 0 ปล่อยให้ผู้ใช้มีอิสระที่จะเปลี่ยนการตั้งค่าเริ่มต้นนี้หากพวกเขาต้องการ
Gilles 'หยุดชั่วร้าย'

นั่นคือข้อยกเว้น SIGINT ฆ่างานที่กำลังทำงานอยู่ มีเพียงไม่กี่แอปพลิเคชั่นที่จะขยายขอบเขตเพื่อฆ่างาน "เบื้องหน้า" ของตนเอง คุณจะต้องคิดหรือless vimทราบว่าในcmd | less, CTRL-Cไม่ฆ่าโดยทั่วไปcmd(ในขณะที่สำหรับlessมันจัดการเพื่อยกเลิกการดำเนินการปัจจุบัน (เช่นการค้นหา)) (ต่อ)
Stéphane Chazelas

ฉันพบว่าถ้อยคำของคำตอบของคุณสับสนในเรื่องนั้น ความจริงที่ว่า SIGQUIT โดยทั่วไปไม่ได้รับการจัดการก็คือมันไม่ได้ถูกใช้ในลักษณะเดียวกัน คุณกด CTRL-C เพื่อยกเลิกสิ่งที่คุณทำอยู่ในปัจจุบัน คุณต้องการใช้ `CTRL- \ 'เพียงบางครั้งเท่านั้นสำหรับการดีบักเพื่อสร้างการถ่ายโอนข้อมูลหลัก โดยทั่วไปแล้วไม่มีเหตุผลว่าทำไมแอปพลิเคชั่นต้องการให้คุณพยายามทำเช่นนั้น
Stéphane Chazelas

@ StéphaneChazelasไม่เพียง แต่เป็นแอพพลิเคชั่นที่ใช้เทอร์มินัลส่วนใหญ่ที่อ่านคำสั่งของผู้ใช้ ตัวอย่างเช่น REPL (bash, dash, ksh, zsh, python, irb, fsharpi, Mathematica, …) มันแทบจะไม่แปลกเลย ความคิดเห็นแรกของคุณสำหรับการวาดภาพ SIGINT และ SIGQUIT นั้นแตกต่างกันมากเกินไปและความคิดเห็นล่าสุดของคุณในการวาดภาพ SIGINT และ SIGQUIT นั้นคล้ายคลึงกันมากเกินไปซึ่งทำให้ฉันงงงวยกับสิ่งที่คุณขับรถ
Gilles 'หยุดความชั่วร้าย' ใน

7

นอกจากคำตอบของ Gilles ให้ฉันเพิ่มว่าคุณสามารถป้อนอักขระที่ไม่สามารถพิมพ์ได้ใน bash ด้วยCtrl-v+ key( Ctrl-v+ Ctrl+4ในกรณีนี้) และตรวจสอบรหัสอักขระด้วย

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28

คุณจะได้รับรหัสทศนิยมของตัวละครซึ่งในขณะที่คุณอาจจะตรวจสอบในman asciiสอดคล้องกับการแยกไฟล์ (FS)


ctrl + v ทำอะไร? ฉันเคยเป็นที่ "วางคลิปบอร์ด"
JDługosz

2
@ JDługosz: Ctrl-V บอกให้เครื่องปลายทางไม่ตีความอักขระต่อไปนี้ มันเป็นความจริงที่โชคร้ายที่การใช้คีย์ผสม GUI เข้าควบคุมอักขระควบคุมเหล่านั้นทำให้เกิดความสับสนที่ไม่จำเป็น เคยเป็นที่ Linux ใช้ Alt- [Key] สำหรับแป้น GUI (เช่น Alt-C / Alt / V สำหรับการคัดลอก / วาง) แต่จากนั้นผู้คนเห็นได้ชัดว่าการทำเช่นเดียวกับ Windows นั้นสำคัญกว่า ในขณะเดียวกันผู้ใช้ Mac ยังคงไม่มีปัญหาในการใช้ปุ่มคำสั่งแทนปุ่ม Ctrl สำหรับการดำเนินการเหล่านั้น
celtschk

คำสั่ง (สั้นกว่า) คือ: printf '%d\n' '"^\'?
ไอแซค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.