Запускается ли bash в каноническом или неканоническом режиме прослушивания команд?

Вопрос или проблема

У меня есть три небольших вопроса относительно режима терминала, в котором находится bash, ожидая мои команды:

  1. Когда bash ожидает мою команду, работает ли он в терминале, который находится в каноническом или неканоническом режиме?
  2. Если это неканонический режим, означает ли это, что bash берет на себя ответственность за эхо, или bash должен дополнительно вызвать stty -echo после stty -icanon? Иными словами, может ли терминал находиться в неканоническом режиме и иметь “автоматическое” эхо драйвера, эти две вещи (неканонический режим и “автоматическое” эхо) не исключают друг друга?
  3. Переключает ли bash сначала терминал обратно в канонический режим перед выполнением команды и передачей ей управления, и переключает ли он обратно в неканонический режим после завершения команды?

Это неканонический режим

Если бы это был канонический режим, он не смог бы интерпретировать нажатия клавиш tab и ^r интерактивно.

Вероятно, есть детали в документации libreadline.

Я запустил stty (в другом терминале) против терминала, в котором работает моя bash-сессия, и получил такой результат:

$ stty -F /dev/pts/14
speed 38400 baud; line = 0;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
-brkint -icrnl -imaxbel iutf8
-icanon -echo

Таким образом, canon и echo отключены

При запуске команды (в данном случае “sleep 100”) он сбрасывает состояние терминала.

$ stty -F /dev/pts/14
speed 38400 baud; line = 0;
-brkint -imaxbel iutf8

Ответ или решение

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

1. В каком режиме терминал работает при ожидании команды от bash?

Терминал в bash работает в неканоническом режиме. Это ключевая особенность, позволяющая интерпретировать такие ключевые нажатия как Tab и Ctrl+R в интерактивном режиме. В каноническом режиме каждая строка должна быть завершена символом конца строки, прежде чем быть переданной в приложение. Неканонический режим позволяет bash обеспечивать интерактивную функциональность, что делает взаимодействие более гибким и динамичным.

2. Ответственность bash за вывод символов (эхо)

Переход в неканонический режим не обязательно отключает автоматическое эхо. В выводе вашей команды stty мы видим, что, когда bash ждет команду, эхо выключено (-echo). Это указывает на то, что bash берет на себя ответственность за вывод символов, что полезно для поддержки интерактивных функций, таких как автодополнение команд или скрытие ввода паролей.

3. Изменение режима терминала при запуске команд

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...