Você deve usar tee --output-error=exit-nopipe
. Isso ignoraria o erro SIGPIPE
e EPIPE
de gravação, mas ainda morreria em outros erros.
tee --output-error=exit-nopipe
, assim como o warn
variant da sua resposta, sai quando não pode gravar em pelo menos uma das suas saídas; mas conta a saída padrão como um deles.
Seus exemplos são problemáticos, porque eles simplesmente despejam a saída de head -c10G /dev/zero | tee ...
em seu terminal (que você não pode ver porque o byte nulo é "invisível"); e é por isso que o tee
em sua resposta não sai: porque ele ainda estará gravando para stdout depois que as substituições do processo >(...)
tiverem saído.
Para sistemas sem GNU tee, uma solução possível é incluir cat >/dev/null
nos comandos para os quais a saída de tee
é canalizada; mas você não pode fazer isso com todos eles; você terá que decidir sobre uma saída "master" que fará com que tee
seja encerrado se a gravação não for bem-sucedida. Exemplo:
$ dd if=/dev/zero |
tee >(dd of=/dev/null count=200; cat >/dev/null) >(dd of=/dev/null count=700; cat >/dev/null) |
dd of=/dev/null count=1000
$ dd if=/dev/zero |
tee >(dd of=/dev/null count=1000) >(dd of=/dev/null count=700; cat >/dev/null) |
{ dd of=/dev/null count=200; cat >/dev/null; }
Ambos devem escrever 200, 700 e 1000 blocos, respectivamente.