当前位置: 首页>>技术教程>>正文


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

, , ,

问题描述

例如,如果我是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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1232.html,未经允许,请勿转载。