Использует ли zsh канонический режим для терминала?

Использует ли zsh канонический режим для терминала?

Я исследовал terminfoи stty. Если я запускаю, stty -a|grep icanonкажется, что канонический режим установлен, но если я пытаюсь отключить его с помощью stty -icanonи проверить снова, я вижу, что он все еще установлен. Когда я делаю то же самое в bash, я могу отключить icanon, но я не замечаю никаких изменений в поведении. Поэтому у меня 2 вопроса: почему я не могу отключить icanon в zsh, и как это должно повлиять на поведение, если я могу?

решение1

Когда я делаю то же самое в bash, мне удаётся отключить icanon, но я не замечаю никаких изменений в поведении.

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

Чтобы увидеть эффект, выполните внешнюю команду, например cat:

bash$ stty -icanon
bash$ cat
hheelloo

Каждая клавиша будет повторяться, один раз, потому что stty echoона включена, и один раз, потому что catона немедленно будет прочитана и записана обратно, вместо того, чтобы ждать завершения строк.

[с zsh] если я попытаюсь отключить его stty -icanonи проверить снова, то увижу, что он все еще установлен.

При восстановлении предыдущих настроек терминала, как описано выше, zshтакже применяетсянекоторые разумные значения по умолчанию(включая настройки echoи icanon). Вероятно, это потому, что предполагается, что если команда вышла из канонического режимавыключенныйпри завершении работы это была просто случайность (например, когда полноэкранное приложение закрывалось viили lessвылетало).

Мне не удалось найти ни одной zshопции, которая заставила бы его работать так же bash(и как любую другую программу, использующую библиотеку readline), но если вы хотите отключить режим icanon перед выполнением команды, вы можете сделать это, вызвав stty из той же командной строки:

zsh$ stty -icanon; cat
hheelloo

Связанный контент