340 votes

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

Existe-t-il un moyen 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 fonctionne pas. Je ne sais pas comment faire.

6voto

Sergiy Kolodyazhnyy Points 97292

Il convient de noter que if...then...fi y && / || Ce type d'approche traite l'état de sortie renvoyé par la commande que nous voulons tester (0 en cas de succès) ; cependant, certaines commandes ne renvoient pas d'état de sortie différent de zéro si la commande a échoué ou n'a pas pu traiter l'entrée. Cela signifie que l'approche habituelle if y && / || ne fonctionneront pas pour ces commandes particulières.

Par exemple, sous Linux, GNU file se termine toujours avec 0 s'il a reçu un fichier non existant comme argument et find n'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 façon potentielle de gérer la situation consiste à lire stderr / stdin les messages, par exemple ceux qui sont renvoyés par les file ou analyser la sortie de la commande comme dans la commande find . À cette fin, case pourrait être utilisée.

$ 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 une reprise de ma propre réponse sur question connexe à unix.stackexchange.com )

5voto

Reinstate Monica Points 179

Comme mentionné dans de nombreuses autres réponses, un simple test de $? fera l'affaire, comme ceci

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

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

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

Cela fonctionne en utilisant le (( )) en mode arithmétique, donc si la commande retournait success c'est-à-dire $? = 0 alors le test est évalué à ((0)) qui est testé comme false sinon, il retournera true .

Pour tester succès vous pourriez utiliser :

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

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

2voto

Pour faciliter le débogage, je fais des commandes pour ne sortir que les erreurs avec :

donc [-tag] [commandes]

Après cela, $ ? est 0 en cas de succès, sinon échec.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X