ลบ ^ C เมื่อ CTRL + C


25

มีวิธีใดบ้างที่จะลบ^Cเมื่อคุณกดCTRL+ Cในเชลล์รวมกับ Red Hat Enterprise Linux 6 ("Santiago")? .bash_profileฉันมีสิทธิ์ในการแก้ไขของตัวเอง


4
ลองset echo-control-characters off
Sundeep

1
ฉันลองแล้ว แต่มันไม่ทำงาน
Fede Gold

คำตอบ:


29

แก้ไข (หรือสร้าง) ~/.inputrcไฟล์ของคุณ เพิ่มบรรทัดว่า

set echo-control-characters Off

สิ่งนี้จะแนะนำไลบรารี GNU Readline (ซึ่ง Bash ใช้) เพื่อไม่ให้เอาต์พุต (echo) อักขระควบคุมใด ๆ บนหน้าจอ การตั้งค่าจะใช้งานได้ในเซสชัน Bash ใหม่ทั้งหมดหลังจากนั้น (และในยูทิลิตี้อื่น ๆ ที่ใช้ไลบรารี Readline)

โปรดสังเกตว่าหากระบบ Unix ของคุณมาพร้อมกับไฟล์กำหนดค่าทั้งระบบสำหรับไลบรารี Readline (โดยปกติ/etc/inputrc) ไฟล์กำหนดค่าส่วนบุคคลของคุณจะต้องรวมไฟล์นั้น:

$include /etc/inputrc
set echo-control-characters Off

อีกทางเลือกหนึ่งคือการทำสำเนาส่วนบุคคลของไฟล์การกำหนดค่าทั้งระบบแล้วปรับเปลี่ยนที่


สวัสดีฉันทดสอบและทำงานได้ดี แต่เมื่อฉันขัดจังหวะคำสั่ง bash ที่ทำงานมันไม่ทำงานตัวอย่างเช่นsleep 180และกด CTRL + C
rɑːdɑː

@ Ten-Coin มันจะทำงานเฉพาะเมื่อคำสั่งใช้ไลบรารี Readline อย่างน่าเสียดาย
Kusalananda

1
หาก~/.inputrcไม่มีอยู่แล้วเพียงแค่สร้างไฟล์อาจสูญเสียการตั้งค่าที่มีอยู่ ในกรณีของฉันฉันแรกพบว่า ctrl + ซ้ายและ ctrl + ขวาหยุดทำงาน การแก้ไขคือการเริ่มต้น~/.inputrcด้วยบรรทัด$include /etc/inputrcนี้ นอกจากนี้ยังสามารถcp /etc/inputrc .inputrcแก้ไขและแก้ไขได้ตามต้องการ
kasperd

2
@kasperd จุดดี! ฉันไม่ทราบว่าการเพิ่มไฟล์กำหนดค่าส่วนบุคคลจะปิดใช้งานการอ่านไฟล์กำหนดค่าทั่วทั้งระบบ (ระบบของฉันไม่มีไฟล์) ฉันจะอัปเดตคำตอบของฉัน
Kusalananda

20

ลองทำสิ่งต่อไปนี้:

stty -echoctl

สำหรับคำอธิบายดูโพสต์นี้ดีและมีรายละเอียดจากStéphane Chazelasซึ่งยังได้อธิบายถึงอื่น ๆ บางsttyคุณสมบัติ

หากคุณต้องการที่จะทำให้เกิดการเปลี่ยนแปลงที่ถาวร (และคุณใช้bashเป็นนัยในคำถามของคุณ) แล้วมันจะดีที่สุดที่จะใส่ลงไปในของคุณ.bashrcตามที่ระบุไว้โดยjlmgในการแสดงความคิดเห็น (ดังนั้นจึงนำไปใช้กับเปลือกหอยโต้ตอบทั้งหมด)


+1 ตรงกันข้ามกับโซลูชัน readline สิ่งนี้น่าจะได้ผลมากที่สุดหากไม่ใช่ทุกสิ่งที่ทำงานในเครื่อง
JoL

1
หนึ่งอาจจะพูดถึงว่ามันจะไม่ทำงานในอาคารทั้งหมดหากใส่ใน.bash_profileเป็นไฟล์ที่จะแยกวิเคราะห์โดยเปลือกเข้าสู่ระบบเท่านั้น ควรใส่.bashrcแทนดังนั้นจึงเป็นการอ่านโดยการเรียกใช้แบบโต้ตอบทั้งหมด
JoL

1
สิ่งนี้จะยังคงสะท้อนเสียงดิบ 0x03 ไบต์ไม่ได้ซึ่งในทางทฤษฎีอาจถูกตีความโดยเทอร์มินัลบางตัว? นอกจากนี้ยังจะมีผลข้างเคียงถ้าคุณทำสิ่งต่าง ๆ เช่นการเรียกใช้คำสั่งที่ไม่ใช่ readline การกดแป้นลูกศรจะย้ายเคอร์เซอร์บนหน้าจอแทนที่จะแสดง^[[A
Random832

1
@ Random832 +1 คุณพูดถูก ฉันเดาว่าการตั้งค่านั้นมีชื่อไม่ดี มันไม่ได้ควบคุมการสะท้อนของตัวควบคุม แต่เป็นการแปลเป็นตัวอักษรที่พิมพ์ได้ก่อนที่จะสะท้อน เพื่อป้องกันผลข้างเคียงนั้นคุณต้องทำstty -echoเช่นกัน แน่นอนว่าเป็นไปเพื่อป้องกันการสะท้อนของทุกอย่างอื่นเช่นกันซึ่งอาจทำให้คำตอบนี้ไม่มีไปถ้าสิ่งที่คุณต้องการก็คือการซ่อน^Cs
JoL

1
@jlmg ถ้า^Cจบในตอนท้ายฉันอาจเห็นด้วยกับคุณ แต่^Cจะพิมพ์ออกมาเมื่อเคอร์เซอร์อยู่ซึ่งสามารถเขียนทับอักขระได้ทุกที่ในคำสั่ง ซึ่งหมายความว่าหากคุณต้องการคัดลอกส่วนของคำสั่งนั้นคุณอาจพบบางสิ่งที่ยุ่งเหยิง และ^Cไม่ได้รับการยอมรับอย่างง่ายดายเมื่อมองไปที่เทอร์มินัลราวกับว่ามันเป็นถ้ามันอยู่ที่ส่วนท้ายของคำสั่ง
kasperd

2

หากคุณกำลังพยายามหาการกำหนดค่าที่จะอนุญาตให้มีการสะท้อนปกติ (รวมถึงechoctl) และเพียงแค่ปิดเสียงสะท้อนของตัวละครที่สร้างสัญญาณและคุณแน่ใจว่ามันควรจะเป็นไปได้เพราะคุณเคยเห็นมันทำงานมาก่อน ...

คุณอาจเคยเห็นมันเป็นอย่างนั้น แต่มันเป็นไปไม่ได้อีกแล้วเนื่องจากการกระทำนี้ :

กระทำ ec5b1157f8e819c72fc93aa6d2d5117c08cdc961

เปิด INTR / QUIT / SUSP echoing ในระเบียบของบรรทัด N_TTY (เช่น ctrl-C จะปรากฏเป็น "^ C" หาก stty echoctl ถูกตั้งค่าและ ctrl-C ถูกตั้งค่าเป็น INTR)

Linux ดูเหมือนจะเป็นระบบปฏิบัติการยูนิกซ์ที่เหมือนระบบเดียว (เมื่อเร็ว ๆ นี้ฉันตรวจสอบสิ่งนี้บน Solaris, BSD, และ Mac OS X) ซึ่งไม่ทำงานในลักษณะนี้และฉันพลาดสิ่งนี้เพราะเป็นการยืนยันภาพที่ดีของการขัดจังหวะโปรแกรม ในคอนโซลหรือ xterm ฉันจำสิ่งนี้ได้ด้วยความรักจาก Unixs ที่ฉันเคยใช้มาหลายปีเช่นกัน การนำสิ่งนี้ไปใช้กับลีนุกซ์ดูเหมือนจะเป็นวิธีที่ดีที่จะทำให้มันเข้ากันได้กับพฤติกรรมที่เหมือนยูนิกซ์มาตรฐานมากกว่า

ถ้าคุณจำความรักวิธีการลินุกซ์ที่ใช้ในการไม่ได้สะท้อนว่า^Cวิธีเดียวที่จะได้รับกลับมาพฤติกรรมเก่าคือการแก้ไขเคอร์เนลของคุณ ในรุ่นที่ผ่านมาสะท้อนของสัญญาณสร้างตัวละครที่เส้น 1215-1218 ของไดรเวอร์ / TTY / n_tty.c

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