如果作业在后台,则防止 Zsh 退出

如果作业在后台,则防止 Zsh 退出

man zsh,您可以看到:

如果您[...]再次尝试退出,shell 不会再次警告您;SIGHUP如果HUP设置了该选项,则挂起的作业将被终止,并且正在运行的作业将被发送信号。

zsh如果作业在后台运行,是否有办法防止退出?

答案1

查看源代码,似乎没有直接的方法来做到这一点。对后台作业的检查是在zexit,当 zsh 主进程决定尝试退出时调用,无论是从exit、从logout、从文件结尾还是各种其他情况退出。要取消退出命令,stopmsg必须为 0。收到“您有(正在运行|暂停|已停止)作业”警告后,stopmsg为 2。唯一的方法stopmsg是关闭准备执行命令(来自非空命令行)两次。因此,如果您运行exit,您输入的下一个命令将不会受到退出保护。

我想不出一种方法来挂钩exit内置函数(或用函数替换它等),从而允许在之后伪造无操作命令来重置stopmsg

您可以禁用exit内置函数,或将其替换为检查是否有作业的函数,例如

function exit {
  emulate -L zsh
  setopt extended_glob
  if [[ -n ${jobstates[(r)s*]} ]]; then
    echo "you have suspended jobs"
    return 1
  fi
  if [[ -n ${jobstates[(r)^done:*]} ]]; then
    echo "you have running jobs"
    return 1
  fi
  builtin exit "$@"
}

但这仅适用于exit,而不适用于其他方法。

对于文件结尾,您可以setopt ignore_eof.

相关内容