¿Cómo deshabilitar set -e para un comando individual?

¿Cómo deshabilitar set -e para un comando individual?

El comando set -e hace que un script bash falle inmediatamente cuando cualquier comando devuelve un código de salida distinto de cero.

  1. ¿Existe una manera fácil y elegante de desactivar este comportamiento para un comando individual dentro de un script?

  2. ¿En qué lugares está documentada esta funcionalidad en el Manual de referencia de Bash (http://www.gnu.org/software/bash/manual/bashref.html)?

Respuesta1

  1. Algo como esto:

    #!/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. Se describe en setla ayuda incorporada:

    $ type set
    set is a shell builtin
    $ help set
    (...)
    Using + rather than - causes these flags to be turned off.
    

Lo mismo está documentado aquí:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin.

Respuesta2

Una alternativa a anular la fianza por error sería forzar el éxito pase lo que pase. Puedes hacer algo como esto:

cmd_to_run || true

Eso devolverá 0 (verdadero), por lo que el conjunto -e no debería activarse

Respuesta3

Si está intentando capturar el código de retorno/error (función o bifurcación), esto funciona:

function xyz {
    return 2
}

xyz && RC=$? || RC=$?

Respuesta4

Otro enfoque, que encuentro bastante sencillo (y se aplica a otras setopciones además de -e):

Utilice $-para restaurar la configuración.

Por ejemplo:

oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...

# Restore things back to how they were
set -$oldopt

Aunque -eespecíficamente, las opciones que otros han mencionado ( || trueo "poner dentro de if") pueden ser más idiomáticas.

información relacionada