Eu uso um sistema em que os scripts utilizam set -e
:
#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
false
echo notreached
Se eu fizer isso:
#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
! false
echo reached
...a última linha é alcançada. No entanto, se eu fizer isso:
#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
! true
echo reached
...a última linha é alcançada, embora ! true
devesse ser false
.
Mais testes:
user@linux:~$ ! false && echo ok
ok
user@linux:~$ ! true && echo ok
user@linux:~$
...então nestes casos, o !
operador funciona corretamente.
No entanto, ele não funciona corretamente com set -e
. Por quê?
Relacionado: http://mywiki.wooledge.org/BashFAQ/105 ...embora isso não responda minha pergunta.
Porque é isso que a norma diz:
http://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#set
O manual do Bash também aponta isso, com uma redação um pouco diferente.
Eu acho que a entrada no BashFAQ nem tenta explicar os detalhes, a frase "Essas regras são extremamente complicadas" deixa isso bem claro. Embora as páginas vinculadas pareçam ter mais do que se gostaria de saber.