Como desabilitar set -e para um comando individual?

Como desabilitar set -e para um comando individual?

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.

  1. Existe uma maneira fácil e elegante de desabilitar esse comportamento para um comando individual dentro de um script?

  2. Em quais locais esta funcionalidade está documentada no Manual de Referência do Bash (http://www.gnu.org/software/bash/manual/bashref.html)?

Responder1

  1. 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
    
  2. Está descrito na setajuda 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 setopçõ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 ( || trueou "colocar dentro de um if") podem ser mais idiomáticas.

informação relacionada