Disown won’t take -h option

disownnohupzsh

I'm running a command that I now realize I'd like to leave running after I close my SSH session. I didn't start it with a & argument, but I have put it in the background (CTRLz, bg). Now I'm trying to make it keep going after I disconnect. That's what disown -h is for, right? I've tried disown -h and disown -h 1 (jobs shows my job as #1), and I get

disown: job not found: -h

Why is disown taking "-h" as a jobspec rather than an argument? I'm in zsh, if that matters.

Best Answer

bash, zsh and ksh93 are the shells that have a disown command. Of the three, bash is the only one that supports a h option. Without -h it emultates zsh behavior (remove from the job table), while with -h it emulates ksh93 behavior (will not send it a SIGHUP upon exit, but doesn't remove it from the job table so you can still bg or fg or kill it).

You could emulate that behavior with zsh, by doing:

typeset -A nohup
trap 'disown %${(k)^nohup}' EXIT
trap 'for i (${(k)nohup}) (($+jobstate[i])) || unset "nohup[$i]"' CHLD

So the nohup associative array holds the list of jobs that are not to be sent a SIGHUP upon exit. So, instead of disown -h %1, you'd write nohup[1]=.

See also setopt nohup to not send SIGHUP to any job upon exit.

Related Question