Зачем мне нужно вставлять 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)
user938271
источник

Ответы:

19

Когда какая-то другая программа выводит fooна печать /dev/pts/9сообщение между ttys, оболочка не участвует в обмене, она не может знать, сколько символов было напечатано или даже был напечатан какой-либо символ. Оболочка все еще верит, что нет символов, которые нужно стереть. Фактически, если вы печатаете fooв терминал и пытаетесь стереть его с помощью возврата, это не сработает. Оболочка не пытается стереть то, чего не считает.

Попробуйте в терминале, где вы использовали команду --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 (все еще присутствует в bash 5.0). Но изменится на 20 (18 для OP) символов в bash-5, если --norc --noprofileпараметры не используются (я не пытался найти причину, не такую ​​важную проблему, IMnshO).

Исаак
источник
Спасибо за ответ. Что касается второй ошибки, с $ printf 'some text', я могу воспроизвести на Bash 5.0 без, --norc --noprofileесли я вставлю 17 символов или более.
user938271
@ user938271 Правильно, вопрос воспроизведен для меня в 20 символов, информация добавлена ​​в ответ, спасибо.
Исаак