Est-il possible de vérifier s'il y a une erreur dans l'exécution d'une commande?
Exemple :
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
J'ai déjà essayé de le faire mais il semble que cela ne fonctionne pas. Je ne sais pas comment faire ça.
command-line
moata_u
la source
la source
valid
) avant de l’appeler.Réponses:
La valeur de retour est stockée dans
$?
. 0 indique un succès, d'autres indique une erreur.Comme toute autre valeur textuelle, vous pouvez la stocker dans une variable pour une comparaison future:
Pour les opérateurs de comparaison possibles, voir
man test
.la source
;
avant leelse
etfi
: `if ...; puis ...; autre ...; fitest
.[ $? ]
(ou de manière équivalentetest $?
) ne fonctionne pas car il correspond$?
à un nombre (0, 1, etc.) qui n'est pas nul. Voir la documentation pourtest
: "Si EXPRESSION est omis, 'test' renvoie false. Si EXPRESSION est un argument unique, 'test' renvoie false si l'argument est null et true sinon."Si vous avez seulement besoin de savoir si la commande a réussi ou échoué, ne testez pas
$?
, testez simplement la commande. Par exemple:Et assigner la sortie à une variable ne change pas la valeur de retour (enfin, sauf si cela se comporte différemment quand stdout n'est pas un terminal bien sûr).
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals explique
if
plus en détail.la source
$?
fait. Vous avez donc tort de dire que tester directement la commande est strictement préférable.local
commande, c'est-à-direlocal foo=$(false); echo $?;
produit0
sur la sortie. Maislocal
n'est pertinent que dans les fonctions bash.la source
command
erreur est renvoyée à l'écran, comment la masquer?command
des erreurs sont écrites sur stderr, vous pouvez utiliser le formulairecommand 2> /dev/null && echo OK || echo Failed
. Les2> /dev/null
redirections stderr en sortie/dev/null
. Cependant, certains utilitaires écriront des erreurs sur stdout (même si c'est une mauvaise pratique). Dans ce cas, vous pouvez omettre le 2 de la redirection, mais vous perdrez toute sortie de la commande. Cette méthode de vérification de la réussite est utile pour une logique ternaire simple, mais pour un comportement plus complexe, il est préférable de vérifier la$?
réussite de la commande ou d'utiliser laif
méthode de blocage décrite dans la réponse de @ geirha.$? doit contenir le statut de sortie de la commande précédente, qui doit être zéro pour aucune erreur.
Donc, quelque chose comme:
dans la plupart des cas, il est plus facile d'utiliser la construction && pour chaîner des commandes qui doivent dépendre les unes des autres. Donc,
cd /nonexistant && echo success!
ne pas écho à succès, car la commande rompt avant &&. Le corollaire est ||, oùcd /nonexistant || echo fail
serait l' écho échouer parce que cd a échoué. (cela devient utile si vous utilisez quelque chose comme || exit, qui mettra fin au script si la commande précédente a échoué.)la source
la source
command; echo $?
?true && echo $? || echo $?
/true; echo $?
etfalse && echo $? || echo $?
/false; echo $?
- vous trouverez, ils font exactement la même chose: Dcommand && echo "success: $?" || echo "fail: $?"
Il convient de noter que
if...then...fi
et&&
/||
type d’approche concerne l’état de sortie renvoyé par la commande à tester (0 en cas de succès); Cependant, certaines commandes ne renvoient pas de statut de sortie non nul si la commande échoue ou ne peut pas traiter les entrées. Cela signifie que les approches habituellesif
et&&
/||
ne fonctionneront pas pour ces commandes particulières.Par exemple, sous Linux, GNU
file
se ferme toujours à 0 s'il a reçu un fichier non existant en argument etfind
ne peut pas localiser le fichier spécifié par l'utilisateur.Dans de tels cas, une solution potentielle consiste à lire
stderr
/ lesstdin
messages, par exemple ceux renvoyés parfile
commande, ou à analyser le résultat de la commande comme dansfind
. À cette fin, unecase
déclaration pourrait être utilisée.(Ceci est un report de ma propre réponse sur une question connexe à unix.stackexchange.com )
la source
Comme mentionné dans de nombreuses autres réponses, un simple test de
$?
va faire, comme ceciSi vous voulez tester si la commande a échoué , vous pouvez utiliser une version plus courte dans
bash
(mais peut-être trop cher) comme suit:Cela fonctionne en utilisant le
(( ))
mode de calcul, donc si la commande est retournésuccess
, à savoir$? = 0
le test évalue à((0))
qui teste commefalse
, sinon elle retourneratrue
.Pour tester le succès , vous pouvez utiliser:
mais ce n'est déjà pas beaucoup plus court que le premier exemple.
la source
Pour la vérification des erreurs de vos commandes:
Inspiré par la fabrication sans gaspillage:
la source
si [$ (commande)]; alors echo "réussir"; Fi
la source
true
réussitif [ $(true) ]; then echo "succeed"; fi
maissucceed
n'est pas imprimé. En fait, cela ne vérifie jamais si cela acommand
réussi. Il devrait juste utiliserif command
comme dans le post de geirha .$(
)
est la substitution de commande .[
]
est une expression conditionnelle . En l'absence de fractionnement des mots et d'expansion du nom de fichier , cette option permet de vérifier si lacommand
sortie est correcte.