Premendo Invio si produce ^ M invece di una nuova riga


94

Ad esempio, se sto tail -fING un file o reading input dell'utente, <Enter>produrrà ^Mnel terminale invece di terminare la reado aggiungendo una nuova riga nello stdout. ^Jfunziona bene.

Sto sshentrando nel sistema Ubuntu, se è importante. Questo succede a me sia in zsh che in bash. Una soluzione con cui ho giocato è rimappare il ^Mto ^Jin zsh, ma sembra che non risolva il problema di root. Qualcuno sa cosa potrebbe causare questo?

Modifica: per rispondere ad alcune domande, sto sshinserendo Ubuntu da OSX. Sto usando iTerm e zsh. Ho anche dimenticato di menzionare che sto usando tmux sulla macchina Ubuntu.

Modifica 2: mancata una domanda. Quando scrivo Ctrl-V Enterottengo ^M(sia su OSX che su Ubuntu).

Modifica 3: su OSX e Ubuntu echo $TERMproduce screen-256color.


Cosa stai usando per ssh su Ubuntu?
— Tasos

Sì --- e da quale sistema operativo? Sembra un problema TERM.
— Rmano,

Cosa ottieni se digiti Ctrl + V seguito da Invio ? Dato che sei in grado di eseguire i comandi bene, questo non è sicuramente un problema della shell.
— Adaephon

2
Un riavvio (involontario) del mio box OSX sembra aver risolto il problema ... Immagino sia uno di quelli. Spero che sia andato per sempre.
— Benekastah,

Anche per me l'unica cosa che ha funzionato è stata un riavvio incluso il nulla osta della NVRAM. Premi e tieni premuti i tasti Comando-Opzione-PR immediatamente dopo aver sentito il suono di avvio per ripristinare anche la NVRAM di OSx
— jonbros

Risposte:


192

Nel caso in cui qualcun altro abbia questo problema, molto probabilmente è un problema con l'impostazione della linea terminale stty piuttosto che un problema TERM. Se ti succede di nuovo, prova a correre stty sanee facci sapere se questo risolve il problema.


22
Funziona anche su OS X.
— Patrick Berkeley,

1
Ha funzionato per me (menta 17.1).
— Deleet,

1
Lavora su Ubuntu Bionic
— protoEvangelion

funziona bene su iTerm2 su Mojave
— Rakib il

ha funzionato per il mio su gattino su archlinux
— yukashima huksay il

31

Prova a correre stty -aper visualizzare le impostazioni del tuo terminale. Il mio sospetto è che l' icrnlimpostazione non sia impostata e verrà visualizzata come -icrnl(il segno meno indica che è disattivata) invece di avere la solita impostazione di essere attiva. Ecco come viene normalmente impostato il mio terminale quando eseguo l'accesso:

$ 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

E non ho problemi con le terminazioni di riga: return (^ M) o invio (^ J) termineranno le righe di input. Ma se icrnlspengo, i codici ^ M compaiono improvvisamente ogni volta che parlo con un programma e premo Invio:

$ 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

Il codice icrnlsignifica "trasforma i ritorni a capo in newline" e nasconde dal programma in esecuzione che potresti digitare ^ M quando Unix vuole davvero ^ J. Le vecchie tastiere avevano un tasto Return e Enter separato (dove Return in genere ti faceva avanzare attraverso un modulo e Enter lo ha inviato), ma oggi generalmente abbiamo un solo tasto di fine riga e quindi questa impostazione del terminale aiuta a combinare i due significati.

Aggiungi il stty icrnlcomando al tuo .profileo .bashrcse trovi che questa è davvero l'impostazione del problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.