web-dev-qa-db-fra.com

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

En parcourant un script Shell, j'ai vu le terme "$?". Quelle est la signification de ce terme?

37
Renjith G

$? se développe jusqu'à l'état de sortie du dernier pipeline de premier plan exécuté. Voir section Paramètres spéciaux du manuel Bash .

En termes plus simples, c'est l'état de sortie de la dernière commande.

43
cjm

réponse de Cjm est correct, mais $? peut être utilisé de manière ridicule dans les scripts Shell, et je voudrais mettre en garde contre cela. Beaucoup de mauvais scripts Shell ont un modèle 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 cela est possible (les problèmes de lisibilité peuvent parfois empiéter), vous devez 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 noms des variables de Shell avec ce qui équivaut à des variables temporaires, 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égation, qui a des capacités cognitives simplicité dans la plupart des situations. Il supprime l'utilisation de $? pour la plupart.

26
Bruce Ediger

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

3
Barun

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

$0- Le nom de fichier du script actuel.

$#- 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.

3
Midhun S Sivan

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

0
Rahul Arora