Dlaczego muszę wstawić 12 znaków, aby wyczyścić ten wiersz poleceń bash?

14

Otwieram terminal xterm (80 kolumn x 24 linie), a następnie uruchamiam $ bash --norc --noprofile, a następnie, $ ttyaby uzyskać nazwę pliku terminala: dane wyjściowe to /dev/pts/9.

Z innego terminala uruchamiam:

$ printf foo >/dev/pts/9

foojest wypisany w wierszu poleceń powłoki w pierwszym terminalu.
Jeśli nacisnę, C-uaby uruchomić unix-line-discard(nazwa funkcji podana przez $ bind -P | grep -i c-u), foonie zostanie usunięta.
Jeśli wstawię 11 spacji i naciśnie C-u, spacje zostaną usunięte, ale nie foo.
Jeśli wstawię 12 spacji i naciśnie C-u, spacje zostaną również usunięte foo.

wprowadź opis zdjęcia tutaj

Dlaczego nie mogę usunąć foopo naciśnięciu, C-ugdy kursor jest tuż za nim, i dlaczego muszę wstawić 12 znaków, aby go usunąć?


Środowisko:

$ 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)
użytkownik938271
źródło

Odpowiedzi:

19

Gdy jakiś inny program drukuje foodo /dev/pts/9komunikacji między ttys, powłoka nie bierze udziału w wymianie, nie może wiedzieć, ile znaków zostało wydrukowanych, a nawet, jeśli wydrukowano dowolny znak. Powłoka wciąż wierzy, że nie ma postaci do wymazania. W rzeczywistości, jeśli drukujesz foona terminalu i próbujesz wymazać go za pomocą backspace, to nie działa. Powłoka nie próbuje wymazać tego, co jej zdaniem nie istnieje.

Wypróbuj w terminalu, w którym użyto polecenia --norc --noprofile:

bash-4.3$ printf 'some text'

uzyskać:

some textbash-4.3$

W tym momencie backspace niczego nie usunie. Również ctrl-uniczego nie usunie. Jeśli wpiszesz niektóre znaki (do 11 z nich) ctrl-uusunie tylko to, co zostało wpisane (podobnie jak backspace). Ale gdy jest więcej niż 11 znaków, polecenie ctrl-upowróci do tego, co uważa za początek linii (szybszy sposób na usunięcie wielu znaków), co spowoduje pozostawienie tego monitu:

some textb

Można to uznać za błąd IMO (wciąż obecny w bash 5.0). Ale zmienia się na 20 (18 dla OP) znaków w bash-5, jeśli --norc --noprofileopcje nie są używane (nie próbowałem znaleźć przyczyny, nie jest to tak ważny problem IMnshO).

Izaak
źródło
Dziękuję za Twoją odpowiedź. Jeśli chodzi o drugi błąd, $ printf 'some text'mogę odtworzyć na bash 5.0 bez --norc --noprofilewstawienia 17 znaków lub więcej.
user938271,
@ user938271 Prawidłowo, problem został odtworzony dla mnie na 20 znaków, informacje dodane do odpowiedzi, dzięki.
Izaak