Нажатие кнопки enter создает вместо символа новой строки символ ^ M

Например, если я являюсь tail -f файла или read пользовательский ввод, <Enter> будет производить ^M в терминале, а не заканчивать read или добавление новой строки в stdout. ^J работает отлично.

Я вхожу в систему ubuntu, если это имеет значение. Это происходит со мной как в zsh, так и в bash. Одно из решений, с которыми я играл, – это переназначение ^M на ^J в zsh, но похоже, что это не устранит проблему с корнем. Кто-нибудь знает, что может быть причиной этого?

Изменить: Чтобы ответить на некоторые вопросы, я вхожу в Ubuntu из OSX. Я использую iTerm и zsh. Я также забыл упомянуть, что я использую tmux на машине Ubuntu.

Изменить 2: упустил вопрос. Когда я нажимаю Ctrl-V Enter я получаю ^M (как на OSX, так и на Ubuntu).

Редактирование 3: В OSX и Ubuntu echo $TERM производит screen-256color .

В случае, если кто-либо другой столкнулся с этой проблемой, это скорее всего проблема со строчной настройкой терминальной линии, а не с проблемой 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 

И у меня нет проблем с концами строк: либо return (^ M), либо enter (^ 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 обычно продвигало вас через форму и вводило ее), но сегодня у нас обычно есть только один ключ окончания строки, поэтому этот параметр терминала помогает объединить два значения.

Добавьте команду stty icrnl в ваш .profile или .bashrc если вы обнаружите, что это действительно проблема.