web-dev-qa-db-fra.com

Comment vérifier si une commande a réussi?

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 ça ne marche pas. Je ne sais pas comment faire ça.

205
moata_u

La valeur de retour est stockée dans $?. 0 indique un succès, d'autres indique une erreur.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Comme toute autre valeur textuelle, vous pouvez la stocker dans une variable pour une comparaison future:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Pour les opérateurs de comparaison possibles, voir man test .

303
Lekensteyn

Si vous avez seulement besoin de savoir si la commande a réussi ou échoué, ne testez pas $?, testez simplement la commande. Par exemple.:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

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).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals explique if de manière plus détaillée.

75
geirha
command && echo OK || echo Failed
21
Abraham Sanchez

$? doit contenir le statut de sortie de la commande précédente, qui doit être zéro pour aucune erreur.

Donc, quelque chose comme:

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

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! aurait pas écho à la réussite, car la commande est interrompue avant &&. Le corollaire de ceci est ||, où cd /nonexistant || echo failwould écho échoue car 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é.)

14
Shaun
command && echo $? || echo $?
5
modrobert

Comme mentionné dans de nombreuses autres réponses, un simple test de $? suffira, comme ceci

if [ $? -eq 0 ]; then something; fi

Si vous voulez tester si la commande échec, vous pouvez utiliser une version plus courte dans bash (mais peut-être surpasser) comme suit:

if (($?)); then something; fi

Cela fonctionne en utilisant le mode arithmétique (( )). Ainsi, si la commande a renvoyé success, c'est-à-dire $? = 0, le test est évalué à ((0)), lequel teste comme false. Sinon, il retournera true.

Pour tester succès, vous pouvez utiliser:

if ! (($?)); then something; fi

mais ce n'est déjà pas beaucoup plus court que le premier exemple.

1
afuna

Pour corriger les erreurs vos commandes:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

Inspiré en fabrication sans gaspillage:

1

Il convient de noter que le type d'approche if...then...fi et &&/|| concerne le statut de sortie renvoyé par la commande que nous voulons tester (0 en cas de succès); Cependant, certaines commandes ne renvoient pas un statut de sortie non nul si la commande échoue ou ne peut pas traiter les entrées. Cela signifie que les approches habituelles ifet &&/|| ne fonctionneront pas pour ces commandes particulières.

Par exemple, sous Linux, GNU fileexiste toujours avec 0 s'il a reçu un fichier inexistant en tant qu'argument et que findn'a pas pu localiser le fichier spécifié par l'utilisateur.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

Dans de tels cas, une solution potentielle consiste à lire les messages stderrname __/stdinname__, par exemple. ceux qui sont retournés par la commande fileou analysent la sortie de la commande comme dans findname__. Pour cela, vous pouvez utiliser l'instruction casename__.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(Ceci est un report de ma propre réponse sur question connexe sur unix.stackexchange.com )

1