为什么需要 `setopt nohup` 才能使 `nohup watch` 在 zsh 中工作?

为什么需要 `setopt nohup` 才能使 `nohup watch` 在 zsh 中工作?

在 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

nohupSIGHUP通过设置导致信号被忽略的信号处理程序来工作SIG_IGN,然后运行要求运行的程序。这对于将信号配置为启动时的方式的目标程序效果很好,这主要意味着程序根本不关注信号。但watch为 和其他信号安装信号处理程序SIGHUP(以便在退出之前恢复对终端设置所做的更改)。

相关内容