Parece um recurso não documentado de disown
. O Bash não pode confundir um PID com um jobspec, pois o jobspec sempre começa com %
.
Existe uma sobreposição nos usos de PID e jobspec no Bash?
No meu script eu armazeno o PID de um comando em uma variável usando $!
. Em seguida, chamo disown
com o PID para remover o trabalho da tabela de trabalhos ativos do shell. Posteriormente, o script pode ou não matar o processo usando kill
dependendo das circunstâncias. O objetivo disso é que as mensagens feias de 'trabalho morto' não apareçam no terminal e tornem a saída legal do meu script feia.
Funciona bem, mas estou confuso com a diferença entre PID e jobspec, porque ...
$! - the PID of the most recent background command.
disown [-ar] [-h] [jobspec ...]
kill [-s sigspec | -n signum | -sigspec] [pid | jobspec]
disown
requer um jobspec, mas estou dando um PID. man bash
diz que disown
retorna 0 a menos que jobspec não especifique um job válido. Eu dou um PID e ele retorna 0, então tudo parece ok.
Uma pesquisa por man bash
para jobspec não faz menção de que um PID pode ser usado em vez de um jobspec em geral e a entrada disown
não diz que um PID pode ser usado em vez de um jobspec.
PID e jobspec não são a mesma coisa, mas existe uma sobreposição em seu uso? Se não, por que meu código funciona? É tão simples quanto disown
ser capaz de pegar um PID em vez de um jobspec e isso não está documentado em man bash
?
Obrigado.
EDITAR
choroba está correta, disown
sendo capaz de obter um PID em vez de um jobspec parece ser um recurso não documentado de disown
. Agora eu confirmei isso com testes em duas versões diferentes do 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]
Apesar de não ser documentado pelo GNU (até onde eu sei), ele é documentado pelo Projeto de Documentação do Linux, na terceira sentença do Comandos de Controle de Trabalho .
Eu enviei um email para o mantenedor da página man do GNU Bash, sugerindo que a entrada disown
na seção de comandos internos do shell seja alterada:
From: disown [-ar] [-h] [jobspec ...]
To: disown [-ar] [-h] [jobspec | pid] ...
Ele confirmou o erro e fez a alteração.
Espero que isso ajude.
END EDIT