按回车键会产生 ^M,而不是换行符

按回车键会产生 ^M,而不是换行符

例如,如果我正在tail -f读取一个文件或者read用户输入,则会在终端中<Enter>生成,而不是结束或者在标准输出中添加换行符。效果很好。^Mread^J

ssh正在进入 ubuntu 系统,如果这很重要的话。这在 zsh 和 bash 中都发生在我身上。我尝试过的一个解决方案是在 zsh 中重新映射 to ^M^J但这似乎无法解决根本问题。有人知道是什么原因造成的吗?

编辑:为了回答一些问题,我ssh从 OSX 进入 Ubuntu。我使用的是 iTerm 和 zsh。我还忘了说我在 Ubuntu 机器上使用 tmux。

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

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

答案1

如果其他人也遇到此问题,则很可能是 stty 终端行设置问题,而不是 TERM 问题。如果您再次遇到此问题,请尝试运行stty sane并告知我们是否已解决问题。

答案2

尝试运行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意思是“将回车符转换为换行符”,并向正在运行的程序隐藏您可能输入 ^M 而 Unix 真正想要的是 ^J。旧键盘曾经有单独的 Return 和 Enter 键(其中 Return 通常用于浏览表单,而 Enter 用于提交表单),但如今我们通常只有一个行结束键,因此此终端设置有助于结合两种含义。

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

答案3

我刚刚在 Ubuntu 20.04 上使用 zsh 时遇到了这个问题,并且都tty sane不起作用stty icrnl

事实证明,这是由于禁用而导致的NumLock
一旦我重新启用它,该Enter键就会再次正常运行。

答案4

我的解决方案:

CTRL+Enter 可以解决您的问题。每当您想在命令行上运行命令时,都可以按 CTRL+ENTER。

相关内容