54 votes

Comment désactiver le set -e pour une commande individuelle ?

La commande set -e fait échouer immédiatement un script bash lorsqu'une commande quelconque renvoie un code de sortie non nul.

  1. Existe-t-il un moyen simple et élégant de désactiver ce comportement pour une commande individuelle dans un script ?

  2. À quels endroits cette fonctionnalité est-elle documentée dans le manuel de référence de Bash ( http://www.gnu.org/software/bash/manual/bashref.html ) ?

45voto

Arkadiusz Drabczyk Points 2334
  1. Quelque chose comme ça :

    #!/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

    Cours :

    $ ./test.sh
    hi
    ./test.sh: line 7: aoeuidhtn: command not found
    next line
    ./test.sh: line 11: ao: command not found
  2. Il est décrit dans set aide intégrée :

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

La même chose est documentée ici : https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin .

31voto

tvon Points 1341

Une alternative à la désactivation de la caution en cas d'erreur serait de forcer un succès quoi qu'il arrive. Vous pouvez faire quelque chose comme ceci :

cmd_to_run || true

Cela retournera 0 (vrai), donc le set -e ne devrait pas être déclenché.

28voto

h0tw1r3 Points 1676

Si vous essayez d'attraper le code de retour/erreur (fonction ou fourchette), cela fonctionne :

function xyz {
    return 2
}

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

14voto

Gustave Points 1317

Le fait que l'option "exit immediately Shell" s'applique ou est ignorée dépend du contexte de la commande exécutée (cf. La section du manuel de référence de Bash sur l'option "Set Builtin". - grâce à Arkadiusz Drabczyk).

En particulier, l'option est ignorée si une commande fait partie du test dans une instruction if. Il est donc possible d'exécuter une commande et de vérifier son succès ou son échec dans un "contexte de sortie immédiate" en utilisant une instruction if comme celle-ci :

#!/bin/bash

set -e

# Uncomment next line to see set -e effect:
#blubb

if blubb; then
  echo "Command blubb was succesful."
else 
  echo "Command blubb failed. Exit code: $?"
fi
echo "Script exited normally."

Il est possible d'omettre l'instruction "alors" et d'utiliser moins de lignes :

if blubb; then :;
else echo "Command blubb failed. Exit code: $?"; fi

7voto

jwd Points 3222

Une autre approche, que je trouve assez simple (et qui s'applique à d'autres pays), est d'utiliser des outils de gestion de la qualité. set options en plus de -e ) :

Utilisez $- pour restaurer les paramètres.

Par exemple :

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

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

Bien que pour -e Plus précisément, les options que d'autres ont proposées ( || true ou "mettre à l'intérieur d'un if ") peut être plus idiomatique.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X