Suponha que eu tenha um pipeline
reader | processor | writer
.
Parece que, por padrão, se processor
ou writer
falharem no melhor dos casos, o pipeline falhará somente depois que o leitor tentar enviar dados ao processador.
Eu preciso que o pipeline inteiro falhe imediatamente se algum dos seus estágios falhar. set -eo pipefail
não ajuda.
Isso é possível sem algumas soluções feias? Parece que uma coisa natural para fazer isso deveria ser possível.
Eu usei um exemplo.
==> script <==
#! /usr/bin/env bash
set -eo pipefail
trap "exit 1" ERR
./read | ./process | ./write
==> read <==
#! /usr/bin/env bash
seq 10 |
while read line; do
>&2 echo echoing $line
echo $line
sleep 2
done
==> process <==
count=0
while read line; do
echo processing $line
count=$((count+1))
if [[ $count == 1 ]]; then
>&2 echo exiting...
exit 1
fi
done
==> write <==
#! /usr/bin/env bash
while read line; do
echo $line
done
Rodando isso dá
echoing 1
exiting...
processing 1
echoing 2
O que torna óbvio que o script não está terminando até que a segunda linha seja reproduzida.