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


159
2018-03-07 11:40


origine


Préférer $ (foo) sur les piqûres `foo`, parce que vous pouvez le nicher, et il est plus facile de le distinguer des apostrophes. - user unknown
BTW, vous devez définir une fonction (valid) avant de l'appeler. - wjandrea


Réponses:


La valeur de retour est stockée dans $?. 0 indique le succès, d'autres indiquent 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 ultérieure:

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.


238
2018-03-07 12:06



C'est bien ... puis-je tenir l'erreur de sortie ?? !! , car dans ce cas j'ai 2 erreur: erreur de commande "text" ex, fichier non trouvé et mon erreur "text" qui est dans ce cas échoué par exemple - moata_u
@moata_u: vous pouvez stocker la valeur dans une variable comme indiqué dans ma réponse. - Lekensteyn
@moata_u: vous devez mettre un ; avant le else et fi: `si ...; puis ...; autre ...; Fi - Lekensteyn
C'est un utilisation inutile de test. - David Foerster
@Blauhirn [ $? ] (ou équivalent, test $?) ne fonctionne pas parce que $? évalue à un nombre (0, 1, etc.) qui n'est pas nul. Voir le docs pour test: "Si EXPRESSION est omis," test "renvoie false. Si EXPRESSION est un argument unique," test "renvoie false si l'argument est null et true." - Lekensteyn


Si vous avez seulement besoin de savoir si la commande a réussi ou échoué, ne vous souciez pas des tests $?, il suffit de tester directement la commande. Par exemple.:

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

Et l'attribution de la sortie à une variable ne change pas la valeur de retour (eh bien, à moins qu'elle se comporte différemment lorsque 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 plus en détail.


60
2018-03-08 23:54



Que faire si vous voulez faire autre chose que de créer des branches comme stocker le booléen pour savoir s'il a échoué ou non dans un fichier .ini? Alors votre variable de sortie ne fait pas cela, mais $? fait, vous êtes donc faux en disant que tester directement la commande est strictement meilleur. - Timothy Swan


command && echo OK || echo Failed

19
2017-12-01 21:19



Si command renvoie une erreur à l'écran, comment le cacher? - Sigur
Si command écrit des erreurs sur stderr, vous pouvez utiliser le formulaire command 2> /dev/null && echo OK || echo Failed. le 2> /dev/null redirige la sortie de stderr vers /dev/null. Cependant, certains utilitaires écrivent 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 du succès est utile pour la logique ternaire simple, mais pour un comportement plus complexe, il est préférable de vérifier $? pour le succès de la commande, ou utilisez le if méthode de bloc décrite dans la réponse de @ geirha. - Bender the Greatest


$? devrait contenir le statut de sortie de la commande précédente, qui devrait ê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. Alors cd /nonexistant && echo success! aurait ne pas écho succès parce que la commande casse avant &&. Le corollaire de ceci est ||, où cd /nonexistant || echo fail  aurait echo é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é.)


12
2018-03-07 12:04



C'est bien ... puis-je tenir l'erreur de sortie ?? !! , car dans ce cas j'ai 2 erreur: erreur de commande "text" ex, fichier non trouvé et mon erreur "text" qui est dans ce cas échoué par exemple - moata_u
@moata_u, voir mywiki.wooledge.org/BashFAQ/002 - geirha


command && echo $? || echo $?

4
2017-08-12 16:01





Pour vérification des 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é dans la fabrication allégée:


2
2017-12-29 04:20





Il convient de noter que if...then...fi et &&/|| type d'approche traite du 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 l'entrée. Cela signifie que l'habituel if et &&/|| les approches ne fonctionneront pas pour ces commandes particulières.

Par exemple, sur Linux GNU file existe toujours avec 0 s'il a reçu un fichier non existant en argument et find impossible de localiser l'utilisateur du fichier spécifié.

$ 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 des manières possibles de gérer la situation est de lire stderr/stdin des messages, par ex. ceux qui sont retournés par file commande, ou analyser la sortie de la commande comme dans find. Pour cela, case déclaration pourrait être utilisé.

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


0
2017-11-13 18:58





Comme mentionné dans de nombreuses autres réponses, un simple test de $? va faire, comme ça

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 excessif) comme suit:

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

Cela fonctionne en utilisant le (( )) mode arithmétique, donc si la commande est retournée success, c'est à dire. $? = 0 alors le test évalue à ((0)) qui teste comme false, sinon il reviendra 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.


0
2017-08-16 21:07