O comando set -e faz com que um script bash falhe imediatamente quando qualquer comando retorna um código de saída diferente de zero.
Existe uma maneira fácil e elegante de desativar esse comportamento para um comando individual em um script?
Em que lugares essa funcionalidade está documentada no Manual de Referência do Bash ( http://www.gnu.org/software/bash/manual/bashref.html )?
Uma alternativa para desabilitar a fiança por erro seria forçar um sucesso, não importa o quê. Você pode fazer algo assim:
Isso retornará 0 (verdadeiro), para que o set -e não seja acionado
fonte
faulty_cmd || :
é outro idioma popular para isso. (O:
comando é sinônimo detrue
).Se você está tentando capturar o código de retorno / erro (função ou bifurcação), isso funciona:
fonte
Se a opção "sair imediatamente do shell" se aplicar ou for ignorada, depende do contexto do comando executado (consulte a seção Manual de Referência do Bash no Set Builtin - graças a Arkadiusz Drabczyk).
Especialmente, a opção é ignorada se um comando fizer parte do teste em uma instrução if. Portanto, é possível executar um comando e verificar seu sucesso ou falha em um "contexto de saída imediata" usando uma instrução if como esta:
É possível omitir a instrução "then" e usar menos linhas:
fonte
Outra abordagem, que considero bastante direta (e se aplica a outras
set
opções além de-e
):Utilize
$-
para restaurar as configurações.Por exemplo:
Embora
-e
, especificamente, as opções que outros tenham mencionado (|| true
ou "colocado dentro de umif
") possam ser mais idiomáticas.fonte
Na verdade, tive uma pergunta semelhante recentemente (embora não tenha postado, cheguei a ela) e, pelo que posso ver, parece que apenas use set + e antes do comando e set -e depois funcionem com mais elegância. Aqui está um exemplo, pegando a resposta do comando e não deixando o erro jogá-lo fora.
Isso agarra a saída da 'fortuna', verificando seu status de saída, ecoando e dizendo isso. Eu acho que é isso que você estava pedindo, ou pelo menos algo parecido? Enfim, espero que isso ajude.
fonte
Eu gosto de começar o subshell se quiser mudar algo temporariamente. O comando abaixo demonstra que o primeiro bad_command é ignorado e o segundo interrompe a execução.
fonte