Ce script ne fait pas écho "après":
#!/bin/bash -e
echo "before"
echo "anything" | grep e # it would if I searched for 'y' instead
echo "after"
exit
Il en serait de même si je supprimais l' -e
option sur la ligne shebang, mais je souhaite la conserver pour que mon script s'arrête en cas d'erreur. Je ne considère pas que grep ne trouve aucune correspondance comme une erreur. Comment puis-je l'empêcher de sortir si brusquement?
bash
grep
exit
error-handling
iago-lito
la source
la source
-e
vous vous en souciez: à tel point que tout problème est catastrophique.var=$(complex command | grep complex_pattern)
qui peut être nul (auquel cas mon programme ne devrait pas se terminer). Il s'agit simplement d'un script réduit qui fait que le problème se produit. Pas de trou noir métaphysique dans la logique ici, non? ;)Réponses:
Explication:
Le "||" signifie "ou". Si la première partie de la commande "échoue" (ce qui signifie "grep e" renvoie un code de sortie non nul), la partie après le "||" est exécuté, réussit et renvoie zéro comme code de sortie (
true
renvoie toujours zéro).la source
/bin/true
est:command || :
(donc dans votre cas,set -e; grep 'needle' haystack || :
).true
est intégré dans certains shells (au moinsbash 4.3
sur RHEL)Un moyen robuste d' envoyer des
grep
messages en toute sécurité et en option :Selon le manuel posix , le code de sortie 1 signifie qu'aucune ligne n'est sélectionnée et> 1 signifie une erreur.
la source
Une autre option consiste à ajouter une autre commande au pipeline - une qui n'échoue pas:
echo "anything" | grep e | cat
Étant donné qu'il
cat
s'agit désormais de la dernière commande du pipeline, c'est l'état de sortie decat
, et non degrep
, qui sera utilisé pour déterminer si le pipeline a échoué ou non.la source
Une autre option:
la source
Solution
Explication
set -e
ouset -o errexit
De plus,
:
c'est la commande sans effet dans Bash.la source