Bash anets * variável _PID antes que eu possa esperar no coproc

5

Estou tentando usar coprocessos para canalizar a saída de processos assíncronos processa em outros comandos do shell e, em seguida, verifica o status de saída do processo assíncrono:

coproc LS { ls dir; }
while IFS= read i; do echo "$i"; done <&"$LS" # Do something with the output.
wait "$LS_PID"; echo $? # Check exit status.

O problema é que o código acima não funciona, pelo menos não com Bash 4.3.46(1)-release . Depois que a instrução while for executada, o Bash desatribuirá $LS_PID (provavelmente porque perceba que o processo foi encerrado). A chamada de wait nos processos ainda funciona, por exemplo:

coproc LS { ls dir; }
P=$LS_PID
while IFS= read i; do echo "$i"; done <&"$LS" # Do something with the output.
wait "$P"; echo $? # Check exit status.

Isso imprimirá 0 ou 2 , dependendo do diretório existir. Assim, é apenas um inconveniente que tenho que salvar o PID para outra variável. Mas estou interessado em saber por que isso acontece e se posso influenciar isso.

Por que $LS_PID é desativado antes de eu wait no processo? Esse comportamento é documentado em algum lugar? Existe uma solução fácil para isso, porque eu acho que é um caso de uso comum para usar a saída de um comando e também verificar seu código de saída.

    
por Feuermurmel 13.01.2017 / 15:21

1 resposta

2

Este é o comportamento pretendido da variável COPROC_PID , embora não esteja documentado no manual do Bash.

A solução correta é fazer exatamente o que você fez; salve o valor de $COPROC_PID em uma variável que não será desfeita quando o co-processo terminar.

Observe que isso não funcionará se o co-processo sair antes que você tenha tempo de obter seu PID, portanto, pode ser prudente certificar-se de que sua variável tenha um valor antes de usá-lo.

Referência: link

    
por 09.05.2017 / 12:07

Tags