按Enter会产生^ M而不是换行符


94

例如,如果我正在tail -f文件或read用户输入,<Enter>它将^M在终端中生成而不是结束read或向stdout添加换行符。^J工作正常。

ssh如果有的话,我正在研究ubuntu系统。这在zsh和bash中都发生在我身上。我玩过的一种解决方案是在zsh中重新映射^Mto ^J,但似乎无法解决根本问题。有人知道这可能是什么造成的吗?

编辑:要回答一些问题,我ssh将从OSX进入Ubuntu。我正在使用iTerm和zsh。我也忘记提及我在Ubuntu计算机上使用tmux。

编辑2:错过了一个问题。当我键入时,Ctrl-V Enter我得到^M(在OSX和Ubuntu上)。

编辑3:在OSX和Ubuntu上echo $TERM产生screen-256color


您正在使用什么SSH到Ubuntu?
Tasos 2014年

是的---和哪个操作系统?看来是TERM问题。
Rmano 2014年

如果在键入Ctrl + V后再按Enter,会得到什么?由于您能够很好地执行命令,因此这绝对不是Shell的问题。
阿达芬2014年

2
我的OSX盒的(非自愿)重启似乎已经解决了该问题……我想这就是其中之一。希望它永远消失了。
benekastah'4

对我来说,唯一有效的方法是重新启动,包括清除NVRAM。听到启动声音后,请立即按住Command-Option-PR键,以重置
OSx

Answers:


192

如果其他人遇到此问题,则最有可能是stty终端线路设置问题,而不是TERM问题。如果您再次遇到这种情况,请尝试运行stty sane并告诉我们是否可以解决问题。


22
这也适用于OSX。
Patrick Berkeley

1
为我工作(薄荷17.1)。
Deleet '16

1
在Ubuntu Bionic上工作
protoEvangelion,

在Mojave的iTerm2上运行良好
Rakib

在archlinux上为我的小猫工作
yukashima huksay

31

尝试运行stty -a以查看终端设置。我怀疑您的icrnl设置未设置,而是显示为-icrnl(减号表示它已关闭),而不是将其通常设置为打开。这是我登录时通常设置终端的方式:

$ 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

而且我对行尾没有问题:return(^ M)或enter(^ J​​)将结束输入行。但是,如果我关闭icrnl电源,那么每次我在与程序交谈时,都会突然出现^ M代码,然后按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

该代码icrnl表示“将回车换行”,并在运行的程序中隐藏了您可能在Unix真正需要^ J时键入^ M的情况。旧键盘曾经有一个单独的Return和Enter键(其中Return通常使您进入表单并由Enter提交),但是今天我们通常只有一个行尾键,因此此终端设置有助于将两种含义结合起来。

stty icrnl命令添加到您的命令中,.profile或者.bashrc如果您发现这确实是问题设置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.