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 &