Naciśnięcie Enter powoduje utworzenie ^ M zamiast nowego wiersza

94

Na przykład, jeśli tail -ftworzę plik lub readwprowadzam dane wejściowe użytkownika, <Enter>wygeneruje ^Mw terminalu zamiast kończyć readlub dodawać nowy wiersz do standardowego wyjścia. ^Jdziała w porządku.

Wchodzę sshw system Ubuntu, jeśli to ma znaczenie. Zdarza mi się to zarówno w Zsh, jak i Bash. Jednym z rozwiązań, w które grałem, jest ponowne mapowanie ^Mdo ^Jw zsh, ale wygląda na to, że nie rozwiązałoby to problemu z rootem. Czy ktoś wie, co może być tego przyczyną?

Edycja: Aby odpowiedzieć na niektóre pytania, korzystam sshz Ubuntu z OSX. Używam iTerm i Zsh. Zapomniałem też wspomnieć, że używam tmux na maszynie Ubuntu.

Edycja 2: Nieodebrane pytanie. Kiedy piszę Ctrl-V Enter, dostaję ^M(zarówno w OSX, jak i Ubuntu).

Edycja 3: Na OSX i Ubuntu echo $TERMprodukuje screen-256color.

benekastah
źródło
Czego używasz do ssh w Ubuntu?
Tasos
Tak --- iz jakiego systemu operacyjnego? Wygląda na problem TERM.
Rmano
Co otrzymasz, jeśli wpiszesz Ctrl + V, a następnie Enter ? Ponieważ możesz dobrze wykonywać polecenia, z pewnością nie jest to problem powłoki.
Adaephon
2
Wydaje się, że (mimowolne) ponowne uruchomienie mojego systemu OSX rozwiązało problem ... Myślę, że to jeden z nich. Mam nadzieję, że zniknęło na dobre.
benekastah
Również dla mnie jedyne, co zadziałało, to restart, w tym wyczyszczenie pamięci NVRAM. Naciśnij i przytrzymaj klawisze Command-Option-PR natychmiast po usłyszeniu dźwięku uruchamiania, aby również zresetować NVRAM
OSx

Odpowiedzi:

192

W przypadku, gdy ktoś inny ma ten problem, najprawdopodobniej jest to problem z ustawieniem linii zacisków stty, a nie problem TERM. Jeśli to się powtórzy, spróbuj uruchomić stty sanei daj nam znać, czy to rozwiązuje problem.

hackerb9
źródło
22
Działa to również w systemie OS X.
Patrick Berkeley,
1
Pracował dla mnie (Mennica 17.1).
Deleet,
1
Pracuj nad Ubuntu Bionic
protoEvangelion
działa dobrze na iTerm2 na Mojave
Rakib
pracował dla mojego na kotku na archlinux
yukashima huksay
31

Spróbuj uruchomić, stty -aaby wyświetlić ustawienia terminala. Podejrzewam, że twoje icrnlustawienie nie jest ustawione i będzie pokazane jako -icrnl(znak minus oznacza, że ​​jest wyłączone) zamiast włączania zwykłego ustawienia. Oto jak zwykle mój terminal jest konfigurowany po zalogowaniu:

$ 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

I nie mam problemu z zakończeniami linii: albo return (^ M), albo enter (^ J) zakończy linie wejściowe. Ale jeśli się wyłączę, icrnlkody ^ M nagle pojawiają się za każdym razem, gdy rozmawiam z programem i wciskam 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

Kod icrnloznacza „zamień powrót karetki w nowe linie” i ukrywa przed uruchomionym programem, że możesz pisać ^ M, gdy Unix naprawdę chce ^ J. Stare klawiatury posiadały osobny klawisz Return i Enter (gdzie Return zwykle przechodził przez formularz, a Enter go przesyłał), ale dzisiaj zwykle mamy tylko jeden klawisz kończący wiersz, więc to ustawienie terminala pomaga połączyć dwa znaczenia.

Dodaj stty icrnlpolecenie do swojego .profilelub .bashrcjeśli okaże się, że to jest rzeczywiście ustawienie problemu.

Brandon Rhodes
źródło