Nhấn enter tạo ra ^ M thay vì một dòng mới


94

Ví dụ: nếu tôi đang nhập tail -fmột tệp hoặc readnhập dữ liệu người dùng, <Enter>sẽ tạo ^Mtrong thiết bị đầu cuối thay vì kết thúc readhoặc thêm một dòng mới vào thiết bị xuất chuẩn. ^Jhoạt động tốt

Tôi đang sshtham gia vào hệ thống Ubuntu, nếu điều đó quan trọng. Điều này xảy ra với tôi cả trong zsh và bash. Một giải pháp tôi đã chơi với được Remapping ^Mđể ^Jtrong zsh, nhưng điều đó có vẻ như nó sẽ không giải quyết được vấn đề gốc. Bất cứ ai biết những gì có thể gây ra điều này?

Chỉnh sửa: Để trả lời một số câu hỏi, tôi đang sử dụng sshUbuntu từ OSX. Tôi đang sử dụng iTerm và zsh. Tôi cũng quên đề cập rằng tôi đang sử dụng tmux trên máy Ubuntu.

Chỉnh sửa 2: Bỏ lỡ một câu hỏi. Khi tôi gõ Ctrl-V Entertôi nhận được ^M(cả trên OSX và Ubuntu).

Chỉnh sửa 3: Trên OSX và Ubuntu echo $TERMsản xuất screen-256color.


Bạn đang sử dụng gì để ssh với Ubuntu?
TASos

Có --- và từ hệ điều hành nào? Có vẻ như một vấn đề HẠN.
Rmano

Bạn nhận được gì nếu bạn gõ Ctrl + V theo sau là Enter ? Vì bạn có thể thực thi các lệnh tốt, đây chắc chắn không phải là vấn đề của shell.
Adaephon

2
Việc khởi động lại (không tự nguyện) hộp OSX của tôi dường như đã khắc phục được sự cố ... Tôi đoán đó là một trong số đó. Hy vọng rằng nó sẽ tốt
benekastah

Ngoài ra, đối với tôi, điều duy nhất có hiệu quả là khởi động lại bao gồm cả việc giải phóng NVRAM. Bấm và giữ phím Command-Option-PR ngay lập tức sau khi bạn nghe thấy âm thanh khởi động cũng phải thiết lập lại NVRAM của OSX
jonbros

Câu trả lời:


192

Trong trường hợp bất kỳ ai khác có vấn đề này, rất có thể đó là sự cố với cài đặt dòng thiết bị đầu cuối stty chứ không phải là vấn đề HẠN. Nếu điều này xảy ra với bạn một lần nữa, hãy thử chạy stty sanevà cho chúng tôi biết nếu điều đó khắc phục nó.


22
Điều này cũng hoạt động trên OS X.
Patrick Berkeley

1
Làm việc cho tôi (Mint 17.1).
Deleet

1
Hoạt động trên Ubuntu Bionic
protoEveachion

hoạt động tốt trên iTerm2 trên Mojave
Rakib

làm việc cho tôi trên kitty trên archlinux
yukashima huksay

31

Hãy thử chạy stty -ađể xem các thiết lập thiết bị đầu cuối của bạn. Sự nghi ngờ của tôi là icrnlcài đặt của bạn không được đặt và sẽ được hiển thị dưới dạng -icrnl(dấu trừ có nghĩa là nó bị tắt) thay vì cài đặt thông thường được bật. Đây là cách thiết bị đầu cuối của tôi thường được thiết lập khi tôi đăng nhập:

$ 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

Và tôi không có vấn đề gì với kết thúc dòng: hoặc return (^ M) hoặc enter (^ J) sẽ kết thúc dòng đầu vào. Nhưng nếu tôi icrnltắt thì ^ M mã đột nhiên xuất hiện mỗi khi tôi đang nói chuyện với một chương trình và nhấn 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

Mã này icrnlcó nghĩa là lượt xe ngựa quay trở lại thành dòng mới, và ẩn khỏi chương trình đang chạy mà bạn có thể đang gõ ^ M khi Unix thực sự muốn ^ J. Bàn phím cũ được sử dụng để có một phím Return và Enter riêng biệt (trong đó Return thường nâng cao bạn thông qua một biểu mẫu và Enter đã gửi nó), nhưng ngày nay chúng ta thường chỉ có một phím kết thúc dòng và vì vậy cài đặt đầu cuối này giúp kết hợp hai ý nghĩa.

Thêm stty icrnllệnh vào .profilehoặc .bashrcnếu bạn thấy rằng đây thực sự là cài đặt vấn đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.