8

По какой-то причине Zsh read эхо ^M вместо того, чтобы принимать их как <Enter> нажатия клавиш. (Если задано -d , то они распознаются как <Enter> , но все еще отражаются.) Он также не поддерживает основы, такие как клавиша возврата.

Я могу обойти это, взломав / запустив bash ,

> a=$(bash -c 'read -e -p "What would you like to do?: " tmp; echo $tmp')
What would you like to do?: eat cake
> echo $a                                                                
eat cake

но мне интересно, есть ли более чистый путь.

1 ответ1

16

Для удобного ввода строки текста в zsh используйте vared. Использование vared вместо read вызывает zle, что эквивалентно передаче -e в bash для вызова readline.

vared -p 'What would you like to do?: ' -c tmp

Поведение, которое вы описываете с обычным read похоже на неправильно настроенный терминал, а не на проблему с оболочкой. Запустите stty -a чтобы показать настройки терминала, и убедитесь, что для eol установлено значение ^M а для erase установлено значение, отправляемое клавишей Backspace . В зависимости от операционной системы и того, как она настроена и на терминале, Backspace отправляет либо ^H либо ^? , Настройка backspace обычно происходит неправильно из-за некоторого файла конфигурации, который пытается установить его вручную, поэтому первое, что вы должны сделать, это отследить и удалить любую такую неправильную конфигурацию. Если вы ничего не нашли, просмотрите настройки вашего эмулятора терминала, чтобы убедиться, что он не установлен в какой-либо исторический режим совместимости. Если ничего не помогает , добавьте что-то вроде этого в ваш ~/.zshrc:

if [[ $(ps -o comm= $PPID) = iterm ]]; then
  stty erase '^?'
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .