Por que esse comando composto {…} não sai por erro, quando usado com ||?

4

Estou tentando executar este script:

#!/bin/bash -e

{ 
    echo "Doing something"; 
    will_fail                 # like 'false' 

    echo "Worked"; 
} || echo "Failed"

Para minha surpresa, will_fail falhou, mas não vi "Falha" na linha de comando, mas sim "Trabalhou".

Por que o comando composto não saiu com erro depois que will_fail falhou?

    
por Minix 22.09.2017 / 11:40

1 resposta

11

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 comando will_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 the while, until, if, or elif 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 como will_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.

por 22.09.2017 / 11:44