Al presionar enter se produce ^ M en lugar de una nueva línea

94

Por ejemplo, si estoy ingresando tail -fun archivo o readingresando la entrada del usuario, <Enter>produciré ^Men el terminal en lugar de terminar reado agregar una nueva línea a stdout. ^Jfunciona bien.

Estoy sshingresando al sistema ubuntu, si eso importa. Esto me pasa tanto en zsh como en bash. Una solución con la que jugué es reasignar a ^Mto ^Jen zsh, pero parece que no solucionaría el problema raíz. Alguien sabe lo que podría estar causando esto?

Editar: para responder algunas preguntas, estoy sshingresando a Ubuntu desde OSX. Estoy usando iTerm y zsh. También olvidé mencionar que estoy usando tmux en la máquina Ubuntu.

Edición 2: se perdió una pregunta. Cuando escribo Ctrl-V Enterme sale ^M(tanto en OSX como en Ubuntu).

Edición 3: en OSX y Ubuntu echo $TERMproduce screen-256color.

benekastah
fuente
¿Qué estás usando para ssh a Ubuntu?
Tasos
Sí --- y desde qué sistema operativo? Parece un problema TÉRMINO.
Rmano 01 de
¿Qué obtienes si escribes Ctrl + V seguido de Enter ? Como puede ejecutar comandos muy bien, esto definitivamente no es un problema del shell.
Adaephon 01 de
2
Un reinicio (involuntario) de mi cuadro OSX parece haber solucionado el problema ... Supongo que es uno de esos. Ojalá se haya ido para siempre.
benekastah 01 de
También para mí, lo único que funcionó fue un reinicio, incluida la autorización de la NVRAM. Mantenga presionadas las teclas Comando-Opción-PR inmediatamente después de escuchar el sonido de inicio para restablecer también la NVRAM de OSx
jonbros

Respuestas:

192

En caso de que alguien más tenga este problema, es muy probable que sea un problema con la configuración de la línea de terminal stty en lugar de un problema TERM. Si esto le sucede nuevamente, intente ejecutar stty saney háganos saber si eso lo soluciona.

hackerb9
fuente
22
Esto también funciona en OS X.
Patrick Berkeley
1
Trabajó para mí (Mint 17.1).
Deleet
1
Trabajo en Ubuntu Bionic
protoEvangelion
funciona bien en iTerm2 en Mojave
Rakib
trabajó para mi en kitty en
archlinux
31

Intente ejecutar stty -apara ver la configuración de su terminal. Mi sospecha es que su icrnlconfiguración no está configurada y se mostrará como -icrnl(el signo menos significa que está desactivada) en lugar de tener su configuración habitual de estar activada. Así es como normalmente se configura mi terminal cuando inicio sesión:

$ 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

Y no tengo ningún problema con las terminaciones de línea: ya sea return (^ M) o enter (^ J) finalizarán las líneas de entrada. Pero si icrnlapago los códigos ^ M aparecen de repente cada vez que estoy hablando con un programa y presiono 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

El código icrnlsignifica "convertir los retornos de carro en nuevas líneas" y oculta del programa en ejecución que podría estar escribiendo ^ M cuando Unix realmente quiere ^ J. Los teclados antiguos solían tener una tecla Intro e Intro separadas (donde la Ingreso generalmente lo avanzaba a través de un formulario y Enter la envió), pero hoy en día generalmente solo tenemos una tecla de final de línea, por lo que esta configuración de terminal ayuda a combinar los dos significados.

Agregue el stty icrnlcomando a su .profileo .bashrcsi encuentra que esta es realmente la configuración del problema.

Brandon Rhodes
fuente