我正在安装一个相对较新的 Linux Mint,直到现在我才注意到任何重大问题,我意识到我无法使用任何交互式读取用户输入的命令行工具。它不是像我期望的那样通过消耗一行输入来处理回车键,而是将^M
字符序列打印到终端并继续提示输入。
例如git add -p
:
Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y^M
Run Code Online (Sandbox Code Playgroud)
经过更多测试后,我意识到所有 shellread
操作都在执行此操作(在zsh
和 中bash
),并且sh
完全无法使用。
zsh 和 bash:
$ read test
value^M^C
$
Run Code Online (Sandbox Code Playgroud)
嘘:
$ echo "test"^M^C
$ exit^M^M^M^C
$
Run Code Online (Sandbox Code Playgroud)
我打开了一个新终端,它似乎没有受到影响,所以我没有被困在这里,但我很想知道发生了什么使这个终端表现得如此。如果人们有理论,我会将损坏的打开一段时间以进行测试。
这通常发生在将终端设置为原始输入模式的程序意外死亡并且无法将终端设置恢复到以前的值时。
一个简单的stty sane
应该将一切重置为正常。
作为使终端“原始”的一部分,通过关闭termios设置中的标志来禁用Carriage-Return ( ^M
, \r
) 到 Line-Feed ( ^J
, \n
) 的转换。这也可以从命令行使用.ICRNL
c_iflag
stty -icrnl
像 bash 这样的 shell 的命令行通常不受此影响,因为 bash 使自己成为原始终端并进行自己的密钥转换(为了提供良好的行编辑功能,如左右移动插入点、命令行历史等),并且仅在运行其他命令时恢复默认终端设置。