J'utilise les options suivantes
set -o pipefail
set -e
Dans le script bash pour arrêter l'exécution en cas d'erreur. J'ai environ 100 lignes de script à exécuter et je ne veux pas vérifier le code de retour de chaque ligne du script.
Mais pour une commande particulière, je veux ignorer l'erreur. Comment puis je faire ça?
La solution:
particular_script || true
Exemple:
$ cat /tmp/1.sh
particular_script()
{
false
}
set -e
echo ein
particular_script || true
echo zwei
particular_script
echo drei
$ bash /tmp/1.sh
ein
zwei
drei
ne sera jamais imprimé.
De plus, je veux ajouter que lorsque pipefail
est activé, il suffit à Shell de penser que le canal entier a un code de sortie non nul lorsque l'une des commandes du tuyau a un code de sortie non nul (avec pipefail
off il faut le dernier).
$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0
Ajoutez simplement || true
après la commande pour laquelle vous souhaitez ignorer l’erreur.
Plus concise:
! particular_script
De la spécification POSIX concernant set -e
(l'emphase mienne):
Lorsque cette option est activée, si une commande simple échoue pour l'une des raisons répertoriées dans Conséquences des erreurs de shell ou renvoie une valeur de statut de sortie> 0, et ne fait pas partie de la liste composée après un mot-clé while, Until, ou if, et ne fait pas partie d'une liste AND ou OR, et n'est pas un pipeline précédé du caractère! mot réservé , le shell doit immédiatement quitter.
Ne pas arrêter et sauvegarder le statut de sortie
Juste au cas où vous voudriez que votre script ne s’arrête pas si une commande particulière échoue et que vous souhaitiez également enregistrer le code d’erreur de la commande en échec:
set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE
Au lieu de "renvoyer true", vous pouvez également utiliser l'utilitaire "noop" ou null (comme indiqué dans le spécifications POSIX ) :
et juste "ne rien faire". Vous économiserez quelques lettres. :)
#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."
J'utilise l'extrait de code ci-dessous lorsque je travaille avec des outils CLI et je veux savoir s'il existe une ressource ou non, mais le résultat ne m'intéresse pas.
if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
echo "none exist actually exist!"
fi
tandis que || true
est préféré, mais vous pouvez aussi faire
var=$(echo $(exit 1)) # it shouldn't fail
J'aime un peu cette solution:
: `particular_script`
La commande/script entre les ticks arrière est exécutée et sa sortie est transmise à la commande ":" (ce qui équivaut à "vrai")
$ false
$ echo $?
1
$ : `false`
$ echo $?
0
edit: correction d'une faute de frappe moche