Failed
não será impresso porque o status de saída do comando composto é o do último comando em execução em { ...; }
, que é echo
. O echo
é bem-sucedido, portanto, o comando composto sai com um status de saída igual a zero.
O seguinte produziria três strings:
{ echo "Do something"; echo "Worked"; false; } || echo "Failed"
De o padrão POSIX :
Unless otherwise stated, the exit status of a command shall be that of the last simple command executed by the command.
Existem várias coisas acontecendo aqui (resumo):
-
Você executa com
set -e
ativo. Isso fará com que o shell seja encerrado se algum comando retornar um status de saída diferente de zero (de maneira geral). No entanto, isso não se aplica aqui, pois o comandowill_fail
faz parte do (comando composto, que faz parte) de uma lista||
(e não da última).Mais uma vez, em o padrão POSIX (minha ênfase):
The
-e
setting shall be ignored when executing the compound list following thewhile
,until
,if
, orelif
reserved word, a pipeline beginning with the!
reserved word, or any command of an AND-OR list other than the last. -
O último comando simples na lista
||
éecho "Failed"
. Isso é o que determina o status geral de saída do comando composto. Como ele é executado com sucesso (e comowill_fail
não fará com que o shell saia), o status será zero, o que significa que o outro lado de||
não será executado.