Tại sao tôi cần chèn 12 ký tự để xóa dòng lệnh bash này?


14

Tôi mở một thiết bị đầu cuối xterm (80 cột x 24 dòng), sau đó chạy $ bash --norc --noprofilevà sau đó $ ttyđể lấy tên tệp của thiết bị đầu cuối: đầu ra là /dev/pts/9.

Từ một thiết bị đầu cuối khác tôi chạy:

$ printf foo >/dev/pts/9

foođược in trên dòng lệnh shell trong terminal đầu tiên.
Nếu tôi nhấn C-uđể chạy unix-line-discard(tên của hàm được cung cấp bởi $ bind -P | grep -i c-u), foosẽ không bị xóa.
Nếu tôi chèn 11 khoảng trắng và nhấn C-u, khoảng trắng sẽ bị xóa nhưng không foo.
Nếu tôi chèn 12 dấu cách và nhấn C-u, các khoảng trắng cũng sẽ bị xóa foo.

nhập mô tả hình ảnh ở đây

Tại sao tôi không thể xóa fookhi tôi nhấn C-utrong khi con trỏ của tôi ở ngay sau nó và tại sao tôi cần phải chèn 12 ký tự để xóa nó?


Môi trường:

$ 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)

Câu trả lời:


19

Khi một số chương trình khác được in footới /dev/pts/9giao tiếp giữa các ttys, shell không tham gia trao đổi, nó không thể nhận biết có bao nhiêu ký tự được in hoặc ngay cả khi bất kỳ ký tự nào được in. Shell vẫn tin rằng không có nhân vật để xóa. Trong thực tế, nếu bạn in foora thiết bị đầu cuối và cố gắng xóa nó bằng backspace thì nó không hoạt động. Vỏ không cố xóa những gì nó tin là không có ở đó.

Hãy thử trong thiết bị đầu cuối nơi bạn đã sử dụng lệnh --norc --noprofile:

bash-4.3$ printf 'some text'

để có được:

some textbash-4.3$

Tại thời điểm đó, backspace sẽ không xóa bất cứ điều gì. Ngoài ra ctrl-usẽ không xóa bất cứ điều gì. Nếu bạn nhập một số ký tự (tối đa 11 ký tự) ctrl-usẽ chỉ xóa những gì đã nhập (cũng như backspace). Nhưng khi có nhiều hơn 11 ký tự, lệnh ctrl-usẽ quay trở lại những gì nó tin là phần đầu của dòng (một cách nhanh hơn để xóa nhiều ký tự) sẽ để lại lời nhắc này:

some textb

Đó có thể được coi là một lỗi IMO (vẫn có trong bash 5.0). Nhưng thay đổi thành 20 (18 cho OP) ký tự trong bash-5 nếu các --norc --noprofiletùy chọn không được sử dụng (Tôi chưa cố gắng tìm lý do, không phải là vấn đề quan trọng IMnshO).


Cảm ơn bạn đã trả lời. Về lỗi thứ hai, với $ printf 'some text', tôi có thể sao chép trên bash 5.0 mà không cần --norc --noprofilechèn 17 ký tự trở lên.
dùng938271

@ user938271 Đúng, vấn đề được sao chép cho tôi ở 20 ký tự, thông tin được thêm vào câu trả lời, cảm ơn.
Isaac
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.