ฉันรู้ว่านี่ได้รับคำตอบแล้ว แต่คำตอบไม่ได้อธิบายว่าเกิดอะไรขึ้น
ตัวอักษรเช่นCtrl+ Lจะถูกจัดการโดยแอพลิเคชัน ในกรณีของการป้อนข้อมูลเข้าสู่เปลือกเช่นbash
มันล้างหน้าจอ แอปพลิเคชั่นบางตัวเช่นemacs
ใช้เพื่อวาดหน้าจอและ / หรือป้อนเคอร์เซอร์อีกครั้ง
ตัวอักษรเช่นCtrl+ Uที่พรอมต์รหัสผ่านจะถูกจัดการโดยสายวินัย TTY พวกมันจะทำงานเมื่อใดก็ตามที่เทอร์มินัลอินพุตอยู่ในโหมดแก้ไขบรรทัด "canonical" ซึ่งเป็นโหมดที่โปรแกรมของคุณอยู่ในขณะที่คุณป้อนรหัสผ่าน ในโหมดนี้เป็นเคอร์เนล Linux ที่ตีความอักขระเหล่านี้ คุณสามารถดูว่าฟังก์ชั่นใดได้รับการกำหนดให้กับคีย์ใดในผลลัพธ์ของstty -a
:
speed 38400 baud; rows 45; columns 128; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
ที่นี่คุณจะเห็นว่าCtrl+ Uเชื่อมโยงกับkill
ซึ่ง (ตามหน้า man stty ) จะ "ลบบรรทัดปัจจุบัน" คุณสามารถใช้stty
เพื่อเปลี่ยนการแมปนี้:
stty kill ^E # make ctrl-e erase the line
หน้านี้มีข้อมูลที่ดีมากมายเกี่ยวกับเลเยอร์ TTY หากคุณสนใจ
หากสิ่งต่าง ๆ ไม่สับสนพอ: เมื่อพร้อมที่จะโต้ตอบbash
คุณจะไม่ได้อยู่ในโหมดการแก้ไขบรรทัด "canonical" แต่bash
จะรับตัวละครแต่ละตัวโดยตรงในขณะที่คุณพิมพ์และตีความลำดับการควบคุมเองผ่านไลบรารีreadline ไลบรารีนี้จะให้เกียรติการแมปที่คุณตั้งค่าไว้ในอุปกรณ์เทอร์มินัลของคุณดังนั้นคุณยังสามารถใช้stty
เพื่อเปลี่ยนพวกเขาได้ หรือคุณสามารถปรับแต่งได้อย่างอิสระทั้งในbash
และโปรแกรมที่ใช้ readline อื่น ๆ โดยการตั้งค่าunix-line-discard
คุณสมบัติภายใน~/.inputrc
ไฟล์ของคุณ ดูหน้าbash manสำหรับข้อมูลเพิ่มเติม
เมื่อคุณเรียกใช้โปรแกรมbash
ให้stty icanon
เปิดใช้งานโหมดแก้ไขบรรทัด canonical ( ) อีกครั้งหากเปิดใช้งานมาก่อนแล้วจึงปิดใช้งานอีกครั้งเมื่อโปรแกรมเสร็จสิ้น ( stty -icanon
)