Bash – n overlap in the uses of PID and jobspec in Bash

bashdisown

Is there an overlap in the uses of PID and jobspec in Bash?

In my script I store the PID of a command in a variable using $!. Then I call disown with the PID to remove the job from the shell's active jobs table. Later the script may or may not kill the process using kill depending on circumstances. The purpose of this is so that unsightly 'job killed' messages do not appear in the terminal and make my script's neat output look unsightly.

It works fine, but I am confused by the difference between PID and jobspec, because…

$! - the PID of the most recent background command.
disown [-ar] [-h] [jobspec ...]
kill [-s sigspec | -n signum | -sigspec] [pid | jobspec]

disown requires a jobspec, but I am giving it a PID. man bash says that disown returns 0 unless jobspec does not specify a valid job. I give it a PID and it returns 0, so all seems ok.

A search through man bash for jobspec makes no mention that a PID can be used instead of a jobspec in general and the disown entry does not say a PID can be used instead of a jobspec.

PID and jobspec are not the same thing, but is there an overlap in their use? If not then why does my code work? Is it as simple as disown being able to take a PID instead of a jobspec and that this is not documented in man bash?

Thanks.

EDIT

choroba is correct, disown being able to take a PID instead of a jobspec does seem to be an undocumented feature of disown. I have now confirmed this with tests on 2 different versions of GNU Bash.

GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) [On Linux Mint]
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu) [On Debian]

Although not documented by GNU (as far as I can tell), it is documented by the Linux Documentation Project, in the 3rd sentence on their Job Control Commands page.

I emailed the maintainer of the GNU Bash man page suggesting that the disown entry in the shell builtin commands section be changed:

From: disown [-ar] [-h] [jobspec ...]
To:   disown [-ar] [-h] [jobspec | pid] ...

He has now confirmed the error and has made the change.

Best Answer

It seems like an undocumented feature of disown. Bash can't mistake a PID for a jobspec, as jobspec always starts with a %.

Related Question