O status de saída do pipeline é o status de saída do último comando no pipeline (a menos que a opção pipefail
do shell esteja definida nos shells que a suportam, caso em que o status de saída será o do último comando no pipeline que sai com um status diferente de zero).
Não é possível exibir o status de saída de um pipeline de dentro de um pipeline, pois não há como saber qual seria esse valor até que o pipeline tenha realmente concluído a execução.
O pipeline
which lss | echo $?
é sem sentido porque echo
não lê sua entrada padrão (os pipelines são usados para passar dados entre a saída de um comando para a entrada do próximo). O echo
também não imprimia o status de saída do pipeline, mas o status de saída do comando é executado imediatamente antes do pipeline.
$ false
$ which hello | echo $?
1
which: hello: Command not found.
$ true
$ which hello | echo $?
0
which: hello: Command not found.
Este é um exemplo melhor:
$ echo hello | read a
$ echo $?
0
$ echo nonexistent | { read filename && rm $filename; }
rm: nonexistent: No such file or directory
$ echo $?
1
Isso significa que um pipeline também pode ser usado com if
:
if gzip -dc file.gz | grep -q 'something'; then
echo 'something was found'
fi