为什么 IGNOREEOF 在 Zsh 中不起作用?

Zhe*_*hua 4 linux bash zsh shell

我经常使用 Ctrl-D 退出交互式 python 会话,但有时当 python 会话未打开时我会不小心点击它。这将导致向外壳发送 EOF 并随后关闭它(不要求确认)。我通过谷歌搜索得出了两种解决方案:

  1. set -o ignoreeof
  2. export IGNOREEOF=10

第一个选项在我的 zsh shell 和 bash shell 中完美运行。但是,第二个选项似乎只适用于 bash。当我在 zsh 中时,无论我为 设置什么数字IGNOREEOF,它都会像未设置一样发送 EOF。

有人可以帮助解释为什么 ZSH 会这样行事,还是只是我的 zsh shell 中某些特殊环境设置的结果?

Zer*_*ght 6

ZshIGNOREEOF不像 Bash 那样使用参数。相反,它是您必须通过setopt内置选项设置的选项。来自zshoptions(1)

IGNORE_EOF (-7)

不要在文件结束时退出。需要使用退出或注销。 但是,十个连续的 EOF 无论如何都会导致外壳退出,以避免外壳在其 tty 消失时挂起。

此外,如果设置此选项并使用 Zsh 行编辑器,则可以将 shell 函数实现的小部件绑定到 EOF(通常为 Control-D)而不打印正常的警告消息。这仅适用于普通小部件,不适用于完成小部件。

--如果你想模仿 Bash 的 IGNOREEOF,第二段很重要;见下文

您可以通过将以下内容添加到 shell 配置来启用此选项:

setopt ignore_eof    # Option names are case-insensitive and underscores are optional.
Run Code Online (Sandbox Code Playgroud)

模拟 Bash(可选)

如果您想模拟能够在退出 shell 之前指定Ctrl+D序列数量的 Bash 行为,那么您可以将以下ZLE 小部件定义* 添加到您的配置中:

setopt ignore_eof    # Option names are case-insensitive and underscores are optional.
Run Code Online (Sandbox Code Playgroud)

然后,将小部件添加到 ZLE 并为其创建一个键绑定:

zle -N bash-ctrl-d
bindkey '^D' bash-ctrl-d
Run Code Online (Sandbox Code Playgroud)

ignore_eof但是,您仍然需要设置该选项,否则Ctrl+D将忽略 ZLE 并立即退出 shell,而不管此小部件如何。请参阅答案开头的手册页片段的第二段。

* - 此小部件归功于其原作者 Christoph Lange 和 Bart Schaefer 的更正