
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 desabilitar esse comportamento para um comando individual dentro de um script?
Em quais locais esta funcionalidade está documentada no Manual de Referência do Bash (http://www.gnu.org/software/bash/manual/bashref.html)?
Responder1
Algo assim:
#!/usr/bin/env bash set -e echo hi # disable exitting on error temporarily set +e aoeuidhtn echo next line # bring it back set -e ao echo next line
Correr:
$ ./test.sh hi ./test.sh: line 7: aoeuidhtn: command not found next line ./test.sh: line 11: ao: command not found
Está descrito na
set
ajuda interna:$ type set set is a shell builtin $ help set (...) Using + rather than - causes these flags to be turned off.
O mesmo está documentado aqui:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin.
Responder2
Uma alternativa para anular a fiança por erro seria forçar o sucesso, aconteça o que acontecer. Você pode fazer algo assim:
cmd_to_run || true
Isso retornará 0 (verdadeiro), então o set -e não deve ser acionado
Responder3
Se você está tentando capturar o código de retorno/erro (função ou bifurcação), isso funciona:
function xyz {
return 2
}
xyz && RC=$? || RC=$?
Responder4
Outra abordagem, que considero bastante simples (e se aplica a outras set
opções além de -e
):
Use $-
para restaurar as configurações.
Por exemplo:
oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...
# Restore things back to how they were
set -$oldopt
Embora especificamente -e
, as opções que outros mencionaram ( || true
ou "colocar dentro de um if
") podem ser mais idiomáticas.