Quelle est la signification de $? dans un script shell?

Réponses:

26

La réponse de Cjm est correcte, mais $?peut être utilisée de manière idiote dans les scripts shell, et je tiens à le mettre en garde. Beaucoup de mauvais scripts ont un motif de code répété:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Si possible (les problèmes de lisibilité sont parfois importuns), vous devriez coder cette situation différemment:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

Cette dernière utilisation est plus rapide, ne contamine pas l'espace de nom de variable du shell avec ce qui équivaut à des variables de temp, peut souvent être beaucoup plus lisible pour les humains et encourage l'utilisation de la "logique positive", la pratique de l'écriture conditionnelle sans négations, qui a des effets cognitifs. simplicité dans la plupart des situations. Il élimine l'utilisation de $?la plupart des.

Bruce Ediger
la source
5
Une syntaxe plus compliquée est nécessaire lorsqu'il existe plus de possibilités que 0 ou 1 - les programmes communiquent souvent des informations utiles par le biais de codes de sortie. Et c'est également utile si vous devez réutiliser cette valeur plus tard dans le code (pour la journalisation, par exemple).
Mattdm
3

En plus de ce que cjm a dit , si la valeur de $?est 0, le processus précédent s'est terminé normalement (ou avec succès). Sinon, il y a eu une erreur.

Barun
la source
8
Cela ne signale pas toujours une erreur. diffquitte avec un 0 si les fichiers comparés sont les mêmes, avec un 1 s'ils sont différents et 2 est une erreur.
Shawn J. Goff
2
Cela ne signale jamais une erreur. C'est seulement le statut de sortie de la commande précédente. La règle "0 si la sortie est normale" est une convention (EXIT_SUCCESS / EXIT_FAILURE)
lundi
3

$?-L'état de sortie de la dernière commande exécutée.

$0-Le nom du fichier du script en cours.

$#-Le nombre d'arguments fournis à un script.

$$-Le numéro de processus du shell actuel. Pour les scripts shell, il s'agit de l'ID de processus sous lequel ils s'exécutent.

Midhun S Sivan
la source
0

$? Indiquez-nous l'état d'exécution de la dernière commande d'exécution à l'invite. La valeur '0' indique que la commande a été exécutée avec succès et que '1' signifie échec.

Rahul Arora
la source
2
Non seulement aux invites interactives, mais également dans les scripts, et toute valeur non nulle signifie un échec.
Kusalananda
-3

$?détermine le statut de sortie de la commande exécutée. $suivi de chiffres (par exemple $1, $2etc.) représente les paramètres du script shell.

harika
la source
Vous voudrez peut-être lire la réponse correcte ...
jasonwryan