เหตุใดฉันจึงต้องแทรก 12 อักขระเพื่อล้างบรรทัดคำสั่ง bash นี้


14

ฉันเปิดสถานี xterm (80 คอลัมน์ x 24 สาย) จากนั้นก็วิ่ง$ bash --norc --noprofileแล้ว$ ttyจะได้รับชื่อไฟล์ของขั้ว: /dev/pts/9ออกเป็น

จากเทอร์มินัลอื่นฉันรัน:

$ printf foo >/dev/pts/9

fooถูกพิมพ์ลงบนบรรทัดคำสั่งของเชลล์ในเทอร์มินัลแรก
หากฉันกดC-uเพื่อเรียกใช้unix-line-discard(ชื่อฟังก์ชั่นที่กำหนดโดย$ bind -P | grep -i c-u) fooจะไม่ถูกลบออก
ถ้าผมใส่ 11 ช่องว่างและกดC-uช่องว่างจะถูกลบออก fooแต่ไม่
ถ้าผมใส่ 12 ช่องว่างและกดช่องว่างจะถูกลบออกเช่นเดียวกับC-ufoo

ป้อนคำอธิบายรูปภาพที่นี่

ทำไมฉันไม่สามารถลบออกได้fooเมื่อฉันกดC-uในขณะที่เคอร์เซอร์อยู่ข้างหลังและทำไมฉันต้องแทรก 12 ตัวอักษรเพื่อลบออก?


สิ่งแวดล้อม:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

$ bash --version | head -n1
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

$ xterm -version
XTerm(322)

คำตอบ:


19

เมื่อโปรแกรมอื่นพิมพ์fooไปที่/dev/pts/9การสื่อสารระหว่าง ttys เชลล์จะไม่เข้าร่วมในการแลกเปลี่ยนมันไม่สามารถทราบได้ว่ามีการพิมพ์อักขระจำนวนเท่าใดหรือถึงแม้ว่ามีการพิมพ์อักขระใดก็ตาม เชลล์ยังคงเชื่อว่าไม่มีอักขระที่จะลบ ในความเป็นจริงถ้าคุณพิมพ์fooไปยังเทอร์มินัลแล้วลองลบมันด้วย Backspace มันจะไม่ทำงาน เชลล์ไม่พยายามลบสิ่งที่เชื่อว่าไม่มีอยู่

ลองใช้เทอร์มินัลที่คุณใช้คำสั่ง --norc --noprofile:

bash-4.3$ printf 'some text'

ที่จะได้รับ:

some textbash-4.3$

ณ จุดนั้น Backspace จะไม่ลบอะไรเลย นอกจากนี้ยังctrl-uจะไม่ลบอะไร หากคุณพิมพ์อักขระบางตัว (สูงสุด 11 ตัว) ctrl-uจะลบเฉพาะสิ่งที่พิมพ์ (เช่นเดียวกับ backspace) แต่เมื่อมีมากกว่า 11 ตัวอักษรคำสั่งctrl-uจะกลับไปที่สิ่งที่มันเชื่อว่าเป็นจุดเริ่มต้นของบรรทัด (วิธีที่รวดเร็วกว่าในการลบอักขระจำนวนมาก) ซึ่งจะทำให้ข้อความนี้ปรากฏขึ้น:

some textb

ที่อาจถือเป็นข้อผิดพลาด IMO (ยังคงอยู่ในทุบตี 5.0) แต่เปลี่ยนเป็น 20 (18 สำหรับตัวละคร OP) ใน bash-5 หาก--norc --noprofileไม่ได้ใช้ตัวเลือก (ฉันยังไม่ได้พยายามหาเหตุผลไม่ใช่ปัญหาสำคัญ IMnshO)


ขอบคุณสำหรับคำตอบ เกี่ยวกับข้อผิดพลาดที่สองด้วย$ printf 'some text'ฉันสามารถทำซ้ำใน bash 5.0 โดยไม่ต้อง--norc --noprofileถ้าฉันใส่ 17 ตัวอักษรหรือมากกว่า
user938271

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