O padrão shell POSIX oferece três exceções à aplicação de set -e
:
- A falha de qualquer comando individual em um pipeline multicomando não deve causar a saída do shell. Somente a falha do próprio gasoduto será considerada.
- A configuração -e deve ser ignorada ao executar a lista composta após a palavra reservada while, Until, if ou elif, um pipeline começando com ! palavra reservada ou qualquer comando de uma lista AND-OR diferente do último.
- Se o status de saída de um comando composto diferente de um comando subshell foi o resultado de uma falha enquanto -e estava sendo ignorado, então -e não se aplicará a este comando.
Estou lutando para entender o significado de (3); está se referindo a algo como:
set -e
{ false; } && :
( false ) && :
Aqui { false; }
está um comando composto não subshell com status de saída 1. O status de saída resultou da "falha" de falso. set -e
está sendo ignorado durante a execução false
porque não é o último comando de uma lista AND-OR. O mesmo se aplica a ( false )
, mas é um comando subshell, então é set -e
permitido aplicá-lo no shell pai e assim sair?
Este não parece ser o caso em shells reais, então tenho certeza de que este exemplo não é o que (3) está falando. Afinal, isso significaria coisas como if ( false ); then :; fi
poderia sair ao executar a condição if. Mas, parece que os únicos contextos em que set -e
está sendo ignorado são definidos por (2), então quando (3) poderia ser aplicado de forma lógica?
Essencialmente, qual é um exemplo que demonstra claramente o significado de (3), tanto a que se aplica como por que faz uma distinção para subcamadas?
Acho que "diferente de um comando subshell" significa que todo o composto deve ser um comando subshell.
Compare estes:
O status de saída do
false && :
é:false
)-e
estava sendo ignorado (porque não era o último comando em um pipeline AND-OR)Mas:
Portanto, o primeiro é acionado
set -e
, enquanto o último não deveria.E: