Mengapa saya harus memasukkan 12 karakter untuk menghapus baris perintah bash ini?

14

Saya membuka terminal xterm (80 kolom x 24 baris), kemudian jalankan $ bash --norc --noprofile, dan kemudian $ ttyuntuk mendapatkan nama file terminal: outputnya adalah /dev/pts/9.

Dari terminal lain saya jalankan:

$ printf foo >/dev/pts/9

foodicetak pada baris perintah shell di terminal pertama.
Jika saya tekan C-uuntuk menjalankan unix-line-discard(nama fungsi yang diberikan oleh $ bind -P | grep -i c-u), footidak dihapus.
Jika saya memasukkan 11 spasi dan menekan C-u, spasi akan dihapus tetapi tidak foo.
Jika saya memasukkan 12 spasi dan menekan C-u, spasi juga akan dihapus foo.

masukkan deskripsi gambar di sini

Mengapa saya tidak bisa menghapus fooketika saya menekan C-uketika kursor saya tepat setelah itu, dan mengapa saya harus memasukkan 12 karakter untuk menghapusnya?


Lingkungan Hidup:

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

Jawaban:

19

Ketika beberapa program lain mencetak fooke/dev/pts/9 komunikasi antara ttys, shell tidak berpartisipasi dalam pertukaran, tidak dapat mengetahui berapa banyak karakter yang dicetak atau bahkan jika ada karakter yang dicetak. Shell masih percaya bahwa tidak ada karakter untuk dihapus. Bahkan, jika Anda mencetak fooke terminal dan mencoba untuk menghapusnya dengan backspace itu tidak berfungsi. Shell tidak mencoba menghapus apa yang diyakini tidak ada.

Coba di terminal tempat Anda menggunakan perintah --norc --noprofile:

bash-4.3$ printf 'some text'

mendapatkan:

some textbash-4.3$

Pada titik itu backspace tidak akan menghapus apa pun. Juga ctrl-utidak akan menghapus apa pun. Jika Anda mengetik beberapa karakter (hingga 11 di antaranya) ctrl-uhanya akan menghapus apa yang diketik (seperti halnya backspace). Tetapi ketika ada lebih dari 11 karakter, perintah ctrl-uakan kembali ke apa yang ia yakini sebagai awal dari garis (cara yang lebih cepat untuk menghapus banyak karakter) yang akan meninggalkan prompt ini:

some textb

Itu bisa dianggap sebagai bug IMO (masih ada di bash 5.0). Tetapi perubahan ke 20 (18 untuk OP) karakter di bash-5 jika --norc --noprofileopsi tidak digunakan (saya belum mencoba menemukan alasannya, bukan masalah penting IMnshO).

Ishak
sumber
Terima kasih atas jawabannya. Mengenai bug kedua, dengan $ printf 'some text', saya dapat mereproduksi di bash 5.0 tanpa --norc --noprofilejika saya memasukkan 17 karakter atau lebih.
user938271
@ user938271 Benar, masalah ini direproduksi untuk saya pada 20 karakter, info ditambahkan ke jawabannya, terima kasih.
Isaac