Ввод командной строки, в то время как запущенный скрипт отображает странные символы

8

Если я использую командную оболочку Bash cli и запускаю какую-то программу, которая не возвращается сразу, я ввожу несколько букв (в основном, набираю следующую команду, прежде чем заметить, что предыдущая не завершилась), и ввод всегда выглядит примерно так (особенно при клавиши со стрелками вверх и вниз :)

]]A^ or ]]B^

И мне интересно, является ли этот вид преждевременного ввода «вредным» в любом случае, или что означает возвращаемая строка?

U2ros
источник
1
Это не относится к bash, я бы удалил этот тег.
Диди Кохен

Ответы:

8

Эти строки являются необработанным представлением введенных вами специальных символов (например, home, end, стрелки, табуляция и т. Д.).
Их вредное воздействие контролируется командой, которую вы запускаете, если она получает ввод от терминала, эти символы будут частью ее ввода.
Если он не принимает входные данные от терминала, это не должно иметь каких-либо негативных последствий для любого из известных мне вариантов Unix.

Диди Коэн
источник
13

Некоторые клавиши на вашей клавиатуре не соответствуют реальным символам. Например, Aсоответствует характеру , aно Upи F1ключи не имеют свои собственные специальные символы. Когда эти специальные клавиши нажимаются, вместо получения одного символа, соответствующего клавише, терминал преобразует нажатие клавиши в специальную последовательность из нескольких символов, которая обычно начинается с escape-символа (обычно отображается как ^[). Например, Upобычно генерирует последовательность ^[[A(это 3 символа от одного ключа: escape [и A).

Причина, по которой вы обычно не видите, ^[[Aсостоит в том, что большинство консольных приложений достаточно умны, чтобы преобразовывать специальные последовательности в полезные команды, а не просто выводить их на консоль. Для этого они отключают встроенный эхо-сигнал терминала и выполняют собственную низкоуровневую обработку. Например, когда bashвидит ^[[A, ¹ он понимает, что означает, что вы нажали, Upи вместо того, чтобы ^[[Aвозвращать его назад, он делает целую кучу вещей, чтобы удалить все, что вы уже набрали, извлечь предыдущую команду, сохраненную в истории, и напечатать ее вместо этого.

Если вы видите, ^[[Aкогда нажимаете Up, это обычно означает, что эхо-сигнал терминала включен, и процесс переднего плана (тот, который управляет терминалом) не выполняет какой-либо специальной обработки, упомянутой выше. Это может быть потому, что приложение просто игнорирует терминал (как большинство неинтерактивных команд). Обратите внимание, что обычно оболочка переводит терминал в канонический режим и включает эхо-сигнал перед запуском процесса переднего плана, а также восстанавливает свои собственные настройки после восстановления контроля над терминалом после выхода из команды.

Эхо кажется довольно безобидным. Просто помните, что если запущенная команда не читает с терминала, символы, которые вы сгенерировали с помощью клавиатуры, вероятно, попадут в bashочередь ввода, поэтому будьте осторожны при вводе, поскольку они, вероятно, будут интерпретированы как обычные команды после bashвозобновления чтения. из терминала.

Actually Это на самом деле упрощение. Поскольку конкретная последовательность может варьироваться в зависимости от типа терминала, обычно существует несколько уровней библиотек абстракции между консольным приложением и самим терминалом. Например, bashиспользует readlineбиблиотеку, чтобы сделать большую часть своего ввода.

jw013
источник
1
Из того, что я понял из вопроса, здесь дело было во время выполнения другой команды, а не в серебряном времени между выходом из процесса и до того, как bash восстановил настройки терминала. Тем не менее, я поддержал ваш ответ, поскольку он подробно объясняет ситуацию, в отличие от моего ответа, который является абсолютным минимумом, необходимым для ответа.
Диди Кохен
@ DavidKohen Я думаю, что вы правы по поводу исходного вопроса. Я немного скорректировал свой ответ, чтобы учесть, когда команда еще выполняется.
jw013