web-dev-qa-db-fra.com

Bash en ignorant l'erreur pour une commande particulière

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?

377
Vivek Goel

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
642
Igor Chubin

Ajoutez simplement || true après la commande pour laquelle vous souhaitez ignorer l’erreur.

153
Lars Kotthoff

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.

56
Lily Finley

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
51
Arslan Qadeer

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.."
38
Timo

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
1
Payman

tandis que || true est préféré, mais vous pouvez aussi faire

var=$(echo $(exit 1)) # it shouldn't fail
0
Foto Blysk

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

0
Q-life