При нажатии Enter выводится ^M вместо новой строки

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

Например, если я использую 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, что подтвердило бы тот факт, что проблема существует на уровне настройки терминала, а не в применяемой оболочке.

Возможные причины и рекомендации

  1. Настройки терминала stty:
    Одной из наиболее вероятных причин проблемы является неправильная настройка параметров терминала с помощью утилиты stty.

    • Проверьте настройки вашего терминала, выполнив команду:
      stty -a
    • Обратите внимание на наличие параметра icrnl. Если он отсутствует (отображается как -icrnl), это означает, что для символа возврата каретки (carriage return) не производится автоматическая замена на новую строку (newline):

      -icrnl

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

    stty icrnl

    Если исправление проблема успешна, вы можете добавить эту команду в ваш файл конфигурации .profile или .bashrc, чтобы настройки сохранялись при каждом запуске терминала.

  2. Проблемы с NumLock:
    В некоторых случаях, особенно с определенными клавиатурами, отключение функции NumLock может вызывать проблемы в отображении ввода, включая поведение клавиш Enter. Убедитесь, что NumLock включен, и проверьте, не устранится ли проблема.

  3. Использование команды reset:
    Если указанные команды не помогают, попробуйте ввести в терминале:

    reset

    Это обнулит текущие настройки терминала и может помочь в устранении проблем с отображением символов.

  4. Проблемы с конфигурацией tmux:
    Поскольку вы упомянули использование tmux, стоит проверить конфигурацию tmux на предмет любых пользовательских привязок клавиш, которые могут влиять на работу Enter.

Заключение

Проблема с отображением символа ^M вместо новой строки нажатия клавиши Enter скорее всего связана с неправильной настройкой терминала. Вы можете исправить это, настройкой параметров stty, проверкой состояния NumLock и сбросом терминала при необходимости. Если проблема продолжает возникать, обратите внимание на конфигурацию вашего tmux и терминала.

Если у вас остались вопросы или появились дополнительные проблемы, не стесняйтесь задать их для получения более детальной помощи.

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

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