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 en cours d'exécution et je ne veux pas vérifier le code retour de chaque ligne du script.
Mais pour une commande particulière, je veux ignorer l'erreur. Comment puis je faire ça?
-e
attribut est défini "si la commande qui échoue fait partie de la liste de commandes immédiatement après un mot cléwhile
oruntil
, une partie du test dans uneif
instruction, une partie de toute commande exécutée dans une liste&&
ou||
à l'exception de la commande suivant la dernière&&
ou||
, toute commande dans un pipeline mais la dernière, ou si le statut de retour de la commande est inversé avec!
".(ldd $2/bin/* || true) | grep "not found" | wc -l
script se termine après cette ligne en cas d'échec de retour ldd(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
. lorsqu'ilgrep
ne trouve rien, il renvoie un code de sortie non nul et il suffit au shell de penser que le tube entier a un code de sortie non nul.Ajoutez juste
|| true
après la commande où vous voulez ignorer l'erreur.la source
set -e
et de la tentative de capture d'un message d'erreur: par exempleset -e; TEST=$(foo 2>&1 || true); echo $TEST
Ne vous arrêtez pas et enregistrez également le statut de sortie
Juste au cas où si vous souhaitez que votre script ne s'arrête pas si une commande particulière échoue et que vous souhaitez également enregistrer le code d'erreur de la commande ayant échoué:
la source
command
a réussi et il faut exécuter ce qui suit||
. le lire comme: en cas d'command
échec, faitesEXIT_CODE=$?
. Vous pourriez probablement fairecommand || echo "$?"
ou utiliser "trap" pour un débogage plus détaillé. Voir ceci -> stackoverflow.com/a/6110446/10737630Plus concis:
D'après la spécification POSIX concernant
set -e
(le mien est souligné):la source
-e
.!
cela empêchera l'obus de sortir quoi qu'il arrive. Ce script affiche le messageStill alive!
lorsque je l'exécute, indiquant que le script s'est exécuté jusqu'à son terme. Voyez-vous un comportement différent?if
clause et résolu le problème.Au lieu de "renvoyer vrai", vous pouvez également utiliser l'utilitaire "noop" ou null (comme indiqué dans les spécifications POSIX )
:
et simplement "ne rien faire". Vous économiserez quelques lettres. :)la source
Si vous souhaitez éviter l'échec de votre script et collecter le code retour:
returncode
est collectée, que la commande réussisse ou échoue.la source
J'ai utilisé l'extrait de code ci-dessous lorsque je travaille avec des outils CLI et je veux savoir si certaines ressources existent ou non, mais je ne me soucie pas de la sortie.
la source
if [ -r not_exist ]
J'aime un peu cette solution:
La commande / le script entre les ticks arrière est exécuté et sa sortie est envoyée à la commande ":" (qui est l'équivalent de "true")
edit: Correction d'une faute de frappe
la source
tandis que
|| true
est préféré, mais vous pouvez également fairela source
À partir d'ici, aucune solution n'a fonctionné, alors j'en ai trouvé une autre:
Ceci est utile pour CI et CD. De cette façon, les messages d'erreur sont imprimés mais l'ensemble du script continue de s'exécuter.
la source
Exemple d'utilisation pour créer un fichier journal
la source
Merci pour la solution simple ci-dessus:
La construction suivante peut être utilisée pour des actions / dépannage supplémentaires des actions de script et des options de contrôle de flux supplémentaires:
Nous pouvons freiner les actions supplémentaires et
exit 1
si nécessaire.la source