在 zsh 中,setopt nohup
似乎需要使 nohup 工作,如下所示:
# nohup does not work without setopt nohup
➜ /tmp zsh
➜ /tmp nohup watch ls &
[1] 31556
nohup: ignoring input and appending output to ‘nohup.out’
➜ /tmp exit
zsh: you have running jobs.
➜ /tmp exit
zsh: warning: 1 jobs SIGHUPed
➜ /tmp ps -fp 31556
UID PID PPID C STIME TTY TIME CMD
# It works well with setopt nohup
➜ /tmp zsh
➜ /tmp setopt nohup
➜ /tmp nohup watch ls &
[1] 31216
nohup: ignoring input and appending output to ‘nohup.out’
➜ /tmp exit
zsh: you have running jobs.
➜ /tmp exit
➜ /tmp ps -fp 31216
UID PID PPID C STIME TTY TIME CMD
nori 31216 1 0 19:00 pts/6 00:00:00 watch ls
为什么 zsh 需要setopt nohup
而 bash 不需要?
答案1
nohup
无效,watch
因为watch
安装了一个信号处理程序,SIGHUP
该处理程序覆盖了 所安装的信号处理程序nohup
。
nohup
SIGHUP
通过设置导致信号被忽略的信号处理程序来工作SIG_IGN
,然后运行要求运行的程序。这对于将信号配置为启动时的方式的目标程序效果很好,这主要意味着程序根本不关注信号。但watch
为 和其他信号安装信号处理程序SIGHUP
(以便在退出之前恢复对终端设置所做的更改)。