尝试运行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
如果您发现这确实是问题设置。