Como obtenho o código de retorno de um comando em um pipe, executado como um processo em segundo plano?

2

Dentro de um script Bash, se eu executar um comando dentro de um pipe, o parâmetro especial $? conterá o código de retorno do último comando no pipe. Por exemplo, com um comando intencionalmente com falha rsync , recebo o código de retorno do comando tee :

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2
$ echo $?
0

Eu posso obter o código de retorno do comando rsync usando a primeira entrada na matriz especial que contém os códigos de retorno do último canal $PIPESTATUS

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2
$ echo ${PIPESTATUS[0]}
23

Normalmente, se eu fundo uma tarefa, posso usar wait para coletar seu código de retorno, pois wait espelhará o código de retorno da tarefa em segundo plano que está aguardando.

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 > outfile1 &
$ wait $!
$ echo $?
23

Não consigo combinar esses dois métodos para capturar o código de retorno se o processo em segundo plano incluir um pipe? Tenho a sensação de que combinar os métodos não é a maneira de fazer isso, e preciso usar uma abordagem diferente.

Como executo um comando como o seguinte e coleciono o código de retorno do primeiro comando?

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2 &
    
por Arronical 16.12.2016 / 14:43

0 respostas