问题描述
例如,如果我是tail -f
文件或read
用户输入,<Enter>
将在终端中生成^M
,而不是结束read
或向stdout添加换行符。 ^J
工作正常。
我是ssh
进入ubuntu系统,如果这很重要的话。这在zsh和bash都发生在我身上。我使用的一个解决方案是在zsh中将^M
重新映射到^J
,但这似乎无法解决根问题。有谁知道这可能导致什么?
编辑:回答一些问题,我是从OSX进入Ubuntu的ssh
。我正在使用iTerm和zsh。我也忘了提到我在Ubuntu机器上使用tmux。
编辑2:错过了一个问题。当我键入Ctrl-V Enter
时,我得到^M
(OSX和Ubuntu都有)。
编辑3:在OSX和Ubuntu上echo $TERM
生成screen-256color
。
最佳解决方案
如果其他人有这个问题,很可能是stty终端线设置而不是TERM问题。如果再次发生这种情况,请尝试运行stty sane
并告诉我们是否修复了该问题。
次佳解决方案
尝试运行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
我对行结尾没有任何问题:返回(^ M)或输入(^ J)将结束输入行。但是,如果我关闭icrnl
,那么每当我正在与一个程序交谈并按下回车时,^ M代码突然出现:
$ 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
意味着“将回车换回换行”并隐藏正在运行的程序,当你真的想要^ J时,你可能正在键入^ M.旧键盘曾经有一个单独的Return和Enter键(返回通常会使您通过表单并按Enter提交),但今天我们通常只有一个line-ending键,所以这个终端设置有助于结合这两个含义。
如果您发现这确实是问题设置,请将stty icrnl
命令添加到.profile
或.bashrc
。