Чому мені потрібно вставити 12 символів, щоб очистити цей командний рядок bash?


14

Я відкриваю термінал xterm (80 стовпців х 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-u, пробіли також видаляються foo.

введіть тут опис зображення

Чому я не можу видалити, 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до терміналу і намагаєтесь стерти його із зворотної області, це не працює. Оболонка не намагається стерти те, що вона вважає, що її немає.

Спробуйте в терміналі, де ви використовували команду --norc --noprofile:

bash-4.3$ printf 'some text'

отримати:

some textbash-4.3$

У цей момент резервна область нічого не стирає. Також ctrl-uволя нічого не стирає. Якщо ви введете кілька символів (до 11) ctrl-u, вилучіть лише те, що було введено (як і зворотна область). Але коли налічується більше 11 символів, команда ctrl-uповернеться до того, що вважає її початком рядка (більш швидкий спосіб стерти багато символів), який залишить цей рядок:

some textb

Це може вважатися помилкою IMO (все ще присутній у bash 5.0). Але зміни в 20 (18 для OP) символів в bash-5, якщо --norc --noprofileпараметри не використовуються (я не намагався знайти причину, не така важлива проблема IMnshO).


Дякую за відповідь. Щодо другої помилки, з $ printf 'some text', я можу відтворити на bash 5.0 без того, --norc --noprofileщоб вставити 17 символів або більше.
user938271

@ user938271 Правильно, проблема відтворена для мене на 20 символів, інформація додана у відповідь, дякую.
Ісаак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.