Натискання клавіші Enter створює ^ M замість нового рядка


94

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

Я sshпереживаю систему ubuntu, якщо це має значення. Це трапляється зі мною і в zsh, і в bash. Одне рішення, з яким я грав, - це переоформлення ^Mдо ^Jв zsh, але, схоже, воно не виправить кореневу проблему. Хтось знає, що може бути причиною цього?

Редагувати: Щоб відповісти на деякі запитання, я переглядаю sshUbuntu з OSX. Я використовую iTerm та zsh. Я також забув згадати, що я використовую tmux на машині Ubuntu.

Редагувати 2: Пропущено запитання. Коли я набираю, Ctrl-V Enterя отримую ^M(і на OSX, і на Ubuntu).

Правка 3: На OSX і Ubuntu echo $TERMвиробляється screen-256color.


Що ви використовуєте для ssh для Ubuntu?
Тасос

Так --- і з якої ОС? Здається, це термінова проблема.
Рмано

Що ви отримуєте, якщо введете Ctrl + V, а потім Enter ? Оскільки ви можете виконувати команди просто чудово, це обов`язково не проблема оболонки.
Adaephon

2
Невільний перезапуск мого вікна OSX, здається, вирішив проблему ... Я думаю, це одна з таких. Сподіваємось, це пішло назавжди.
Бенекаста

Крім того, для мене єдиним, що працювало, був перезапуск, включаючи оформлення NVRAM. Натисніть і утримуйте клавіші Command-Option-PR відразу після того, як ви почуєте звук запуску, щоб також скинути NVRAM OSx
jonbros

Відповіді:


192

У випадку, якщо хтось інший має цю проблему, швидше за все, це проблема з налаштуванням строкової термінальної лінії, а не проблема TERM. Якщо це з вами повториться, спробуйте запустити stty saneі повідомте нам, чи це це виправить.


22
Це працює і в OS X.
Патрік Берклі

1
Працював для мене (Монетний двір 17.1).
Деліет

1
Робота над Ubuntu Bionic
protoEvangelion

добре працює на iTerm2 на Мохаве
Ракіб

працював на мою кошенята на
archlinux

31

Спробуйте запустити, 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 подав її), але сьогодні ми, як правило, маємо лише один ключ, що закінчується рядком, і цей параметр терміналу допомагає поєднати два значення.

Додайте stty icrnlкоманду до свого .profileабо .bashrcякщо ви виявите, що це справді проблема налаштування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.