Como esperar por um subprocesso usado para redirecionamento de E / S?

2

Considere o seguinte trecho do script Bash:

exec 3> >(sleep 1; echo "$BASHPID: here")
do-something-interesting
exec 3>&-
wait $!
echo "$BASHPID: there"

Quando executado, produz:

a.sh: line 4: wait: pid 1001 is not a child of this shell
1000: there
1001: here

Como posso modificar a linha wait para que ela realmente aguarde a finalização de 1001 ? Em outras palavras, posso alterar o script para que a saída se torne:

1001: here
1000: there
    
por user16538 18.02.2013 / 16:37

1 resposta

3

Enquanto bash define $! para essa tarefa em segundo plano iniciada com exec 3> >(job) , você não pode esperar por ela ou fazer qualquer outra coisa que possa fazer com job & (como fg , bg ou referencia pelo número do trabalho). ksh93 (onde bash obteve esse recurso) ou zsh nem mesmo definiu $! .

Você pode fazer isso da maneira padrão e portátil:

{
  {
     do-something-interesting
  } 3>&1 >&4 4>&- | { sleep 1; echo "$BASHPID: here"; } 4>&-
} 4>&1
echo "$BASHPID: there"

Em zsh (e é explicitamente documentado )

zmodload zsh/system
{
  do-something-interesting
} 3> >(sleep 1; echo $sysparams[pid]: here)
echo $sysparams[pid]: there

também funcionaria, mas não em ksh93 ou bash .

    
por 18.02.2013 / 22:03