从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
.