
Я исследовал 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