Menekan enter menghasilkan ^ M bukannya baris baru

94

Sebagai contoh, jika saya tail -fmembuat file atau readmemasukkan input pengguna, <Enter>akan menghasilkan ^Mdi terminal alih-alih mengakhiri readatau menambahkan baris baru ke stdout. ^Jbekerja dengan baik.

Saya sshmasuk ke sistem ubuntu, jika itu penting. Ini terjadi pada saya baik di zsh dan bash. Salah satu solusi yang saya mainkan adalah memetakan kembali ^Mke ^Jdalam zsh, tetapi sepertinya itu tidak akan memperbaiki masalah root. Adakah yang tahu apa yang menyebabkan ini?

Sunting: Untuk menjawab beberapa pertanyaan, saya sshmasuk ke Ubuntu dari OSX. Saya menggunakan iTerm dan zsh. Saya juga lupa menyebutkan bahwa saya menggunakan tmux pada mesin Ubuntu.

Sunting 2: Tidak terjawab pertanyaan. Ketika saya mengetik Ctrl-V Entersaya dapatkan ^M(baik di OSX dan Ubuntu).

Sunting 3: Di OSX dan Ubuntu echo $TERMmenghasilkan screen-256color.

benekastah
sumber
Apa yang Anda gunakan untuk ssh ke Ubuntu?
Tasos
Ya --- dan dari OS mana? Tampaknya masalah TERM.
Rmano
Apa yang Anda dapatkan jika Anda mengetik Ctrl + V diikuti oleh Enter ? Karena Anda dapat menjalankan perintah dengan baik, ini jelas bukan masalah shell.
Adaephon
2
Restart (tanpa disengaja) dari kotak OSX saya tampaknya telah memperbaiki masalah ... Saya kira itu salah satunya. Semoga itu hilang untuk selamanya.
benekastah
Bagi saya satu-satunya hal yang berhasil adalah restart termasuk izin NVRAM. Tekan dan tahan tombol Command-Option-PR segera setelah Anda mendengar suara startup untuk juga mengatur ulang NVRAM dari
OSx

Jawaban:

192

Jika ada orang lain yang memiliki masalah ini, kemungkinan besar masalah dengan pengaturan jalur terminal stty daripada masalah TERM. Jika ini terjadi lagi pada Anda, coba jalankan stty sanedan beri tahu kami jika itu memperbaikinya.

hackerb9
sumber
22
Ini berfungsi pada OS X juga.
Patrick Berkeley
1
Bekerja untuk saya (Mint 17.1).
Menghapus
1
Bekerja di Ubuntu Bionic
protoEvangelion
berfungsi dengan baik pada iTerm2 di Mojave
Rakib
bekerja untuk saya di kucing di archlinux
yukashima huksay
31

Coba jalankan stty -auntuk melihat pengaturan terminal Anda. Kecurigaan saya adalah bahwa icrnlpengaturan Anda tidak disetel dan akan ditampilkan sebagai -icrnl(tanda minus berarti dimatikan) alih-alih memiliki pengaturan yang biasa untuk dihidupkan. Berikut adalah bagaimana terminal saya biasanya diatur ketika saya masuk:

$ 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

Dan saya tidak punya masalah dengan akhiran baris: baik kembali (^ M) atau masukkan (^ J) akan mengakhiri jalur input. Tetapi jika saya icrnlmematikan maka ^ kode M tiba-tiba muncul setiap kali saya berbicara dengan sebuah program dan tekan 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

Kode ini icrnlberarti "ubah carriage return menjadi baris baru" dan bersembunyi dari program yang sedang berjalan yang mungkin Anda ketikkan ^ M ketika Unix benar-benar menginginkan ^ J. Keyboard lama dulunya memiliki tombol Return dan Enter yang terpisah (di mana Return biasanya memajukan Anda melalui formulir dan Enter mengirimkannya), tetapi hari ini kami umumnya hanya memiliki satu kunci akhir baris dan oleh karena itu pengaturan terminal ini membantu menggabungkan dua arti.

Tambahkan stty icrnlperintah ke Anda .profileatau .bashrcjika Anda menemukan bahwa ini memang pengaturan masalah.

Brandon Rhodes
sumber