Вопрос или проблема
Например, если я использую tail -f
для файла или read
для ввода данных пользователем, нажатие <Enter>
будет выводить ^M
в терминале вместо завершения read
или добавления новой строки в stdout. ^J
работает нормально.
Я ssh
соединяюсь с системой ubuntu, если это имеет значение. Это происходит как в zsh, так и в bash. Одно из решений, с которым я играл, – это переназначение ^M
на ^J
в zsh, но кажется, что это не решит основную проблему. Кто-нибудь знает, что может быть причиной этого?
Правка: Чтобы ответить на некоторые вопросы, я ssh
соединяюсь с Ubuntu из OSX. Я использую iTerm и zsh. Я также забыл упомянуть, что использую tmux на машине с Ubuntu.
Правка 2: Пропустил вопрос. Когда я нажимаю Ctrl-V Enter
, я получаю ^M
(как на OSX, так и на Ubuntu).
Правка 3: На OSX и Ubuntu echo $TERM
выдает screen-256color
.
Если кто-то еще сталкивается с этой проблемой, то это, скорее всего, проблема с настройкой терминала stty, а не проблема TERM. Если это произойдет с вами снова, попробуйте запустить stty sane
и дайте знать, если это решит проблему.
Попробуйте выполнить stty -a
, чтобы просмотреть настройки вашего терминала. Я подозреваю, что ваша настройка icrnl
не установлена и будет показана как -icrnl
(минус означает, что она выключена) вместо того, чтобы иметь свое обычное значение – включена. Вот как мой терминал обычно настроен, когда я вхожу:
$ stty -a
speed 38400 baud; rows 45; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl -ixon -ixoff
-iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
И у меня нет проблем с окончанием строк: как возврат (^M), так и ввод (^J) завершат ввод строк. Но если я отключу icrnl
, то коды ^M неожиданно появляются каждый раз, когда я общаюсь с программой и нажимаю Enter:
$ stty -icrnl
$ read line
Line of text^M^M^M^M
$ stty -a
speed 38400 baud; rows 45; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
Код icrnl
означает “превратить возвраты каретки в новые строки” и скрывает от работающей программы, что вы можете вводить ^M, когда Unix действительно хочет ^J. Старые клавиатуры обычно имели отдельные клавиши Return и Enter (где Return обычно продвигал вас по форме, а Enter отправлял ее), но сегодня у нас обычно только одна клавиша для окончания строки, и поэтому эта настройка терминала помогает объединить два значения.
Добавьте команду stty icrnl
в ваш .profile
или .bashrc
, если вы обнаружите, что это действительно проблема.
Я только что столкнулся с этой проблемой в zsh на Ubuntu 20.04, и ни tty sane
, ни stty icrnl
не сработали.
В итоге это было вызвано отключением NumLock.
Как только я его снова включил, клавиша Enter снова заработала нормально.
Мое решение:
CTRL+Enter решит вашу проблему. Всякий раз, когда вы хотите выполнить команду в командной строке, вы можете нажимать CTRL+ENTER.
Я публикую свой ответ здесь для случая, который произошел на Mac + Docker shell.
Я исправил эту проблему, выполнив reset
в оболочке.
Я знаю, что это не отвечает на текущий вопрос. Но публикую это здесь, так как этот результат преобладает в результатах поиска.
Ответ или решение
Проблема: Нажатие клавиши Enter приводит к появлению символа ^M вместо новой строки
При использовании терминала и взаимодействии с системой часто возникают проблемные ситуации, которые могут вызывать недоумение. Одной из таких проблем является ситуация, когда нажатие клавиши Enter приводит к выводу символа ^M
, вместо добавления новой строки в системе.
Описание проблемы
Как вы упомянули, вы сталкиваетесь с этой проблемой во время работы в терминале через SSH на Ubuntu с macOS и использованием iTerm. Это происходит как в оболочке zsh, так и в bash. Симптоматика выглядит следующим образом: при вводе данных с клавиатуры или при использовании команды tail -f
, нажатие клавиши Enter отображает ^M
в терминале, в то время как ^J
работает корректно.
Дополнительная информация, которую вы предоставили, говорит о том, что при вводе комбинации Ctrl-V Enter
вы также видите ^M
, что подтвердило бы тот факт, что проблема существует на уровне настройки терминала, а не в применяемой оболочке.
Возможные причины и рекомендации
-
Настройки терминала
stty
:
Одной из наиболее вероятных причин проблемы является неправильная настройка параметров терминала с помощью утилитыstty
.- Проверьте настройки вашего терминала, выполнив команду:
stty -a
-
Обратите внимание на наличие параметра
icrnl
. Если он отсутствует (отображается как-icrnl
), это означает, что для символа возврата каретки (carriage return) не производится автоматическая замена на новую строку (newline):-icrnl
Чтобы решить проблему, попробуйте выполнить команду:
stty icrnl
Если исправление проблема успешна, вы можете добавить эту команду в ваш файл конфигурации
.profile
или.bashrc
, чтобы настройки сохранялись при каждом запуске терминала. - Проверьте настройки вашего терминала, выполнив команду:
-
Проблемы с NumLock:
В некоторых случаях, особенно с определенными клавиатурами, отключение функции NumLock может вызывать проблемы в отображении ввода, включая поведение клавиш Enter. Убедитесь, что NumLock включен, и проверьте, не устранится ли проблема. -
Использование команды
reset
:
Если указанные команды не помогают, попробуйте ввести в терминале:reset
Это обнулит текущие настройки терминала и может помочь в устранении проблем с отображением символов.
-
Проблемы с конфигурацией tmux:
Поскольку вы упомянули использованиеtmux
, стоит проверить конфигурациюtmux
на предмет любых пользовательских привязок клавиш, которые могут влиять на работу Enter.
Заключение
Проблема с отображением символа ^M
вместо новой строки нажатия клавиши Enter скорее всего связана с неправильной настройкой терминала. Вы можете исправить это, настройкой параметров stty
, проверкой состояния NumLock и сбросом терминала при необходимости. Если проблема продолжает возникать, обратите внимание на конфигурацию вашего tmux
и терминала.
Если у вас остались вопросы или появились дополнительные проблемы, не стесняйтесь задать их для получения более детальной помощи.