zsh 是否为终端使用规范模式?

Ben*_*Ben 5 bash zsh terminal readline

我一直在探索terminfostty。如果我运行stty -a|grep icanon它似乎设置了规范模式,但是如果我尝试将其关闭stty -icanon并再次检查,我会看到它仍然设置。当我在 bash 下做同样的事情时,我可以禁用 icanon,但我没有注意到行为有任何变化。所以我有两个问题;为什么我无法在 zsh 中禁用 icanon,如果可以,它应该如何影响行为?

zev*_*zek 7

当我在 bash 下做同样的事情时,我可以禁用 icanon,但我没有注意到行为有任何变化。

那是因为 bash 在从用户读取命令时关闭规范模式(为了能够实现终端驱动程序不提供的行编辑功能——比如插入文本、使用箭头键左右移动光标等) ,然后在运行任何命令行时恢复以前的终端设置。

要查看其效果,请运行如下外部命令cat

bash$ stty -icanon
bash$ cat
hheelloo
Run Code Online (Sandbox Code Playgroud)

每个键都将重复,一次是因为stty echo打开,一次是因为cat将立即读取并写回它,而不必等待完整的行。

[with zsh] 如果我尝试关闭它stty -icanon并再次检查,我会看到它仍然设置。

如上所述恢复以前的终端设置时,zsh还会强制执行一些合理的默认值(包括echoicanon设置)。可能那是因为它假设,如果命令在终止时关闭规范模式,那只是一个意外(例如,当全屏应用程序喜欢viless崩溃时)。

我找不到任何zsh可以使它像bash(以及像使用 readline 库的任何其他程序一样)工作的选项,但是如果您想在运行命令之前关闭 icanon 模式,您可以通过调用 stty 从相同的命令行:

zsh$ stty -icanon; cat
hheelloo
Run Code Online (Sandbox Code Playgroud)