Você só poderia contornar esse problema com isso, por exemplo:
cat <(false || kill $$) <(echo ok)
other_command
A subshell do script é SIGTERM
d antes que o segundo comando possa ser executado ( other_command
). O comando echo ok
é executado "às vezes":
O problema é que as substituições de processo são assíncronas. Não há garantia de que o comando kill $$
seja executado antes ou após o comando echo ok
. É uma questão de agendamento de sistemas operacionais.
Considere um script bash como este:
#!/bin/bash
set -e
set -o pipefail
cat <(echo pre) <(false || kill $$) <(echo post)
echo "you will never see this"
A saída desse script pode ser:
$ ./script
Terminated
$ echo $?
143 # it's 128 + 15 (signal number of SIGTERM)
Ou:
$ ./script
Terminated
$ pre
post
$ echo $?
143
Você pode tentar e depois de algumas tentativas, você verá as duas ordens diferentes na saída. No primeiro, o script foi encerrado antes que os outros dois comandos echo
pudessem gravar no descritor de arquivo. No segundo, o comando false
ou kill
provavelmente foi agendado após os comandos echo
.
Ou, para ser mais preciso: a chamada do sistema signal()
da kill
utillity que envia o sinal SIGTERM
para o processo de shells foi agendada (ou entregue) mais cedo ou mais cedo do que o eco write()
syscalls .
No entanto, o script é interrompido e o código de saída não é 0. Portanto, ele deve resolver o problema.
Outra solução é, claro, usar pipes nomeados para isso. Mas, depende do seu script como seria complexo implementar pipes nomeados ou a solução alternativa acima.
Referências: