web-dev-qa-db-fra.com

Qu'est-ce que "$?" nous donner exactement dans un script shell?

J'ai vu le code écrit quelque part en ligne et je voulais savoir ce que signifie exactement "$?" fait/donnez-nous .. Googling n'a pas aidé.

Voici le code je l'ai vu dans:

#!/bin/sh

ping -c 2 localhost
if [ $? != 0 ] ; then
    echo "Couldn't ping localhost, weird"
    fi

ping -c 2 veryweirdhostname.noend 
if [ $? != 0 ] ; then
    echo "Surprise, Couldn't ping a very weird hostname.."
    fi

echo "The pid of this process is $$"

Extrait de: http://efod.se/writings/linuxbook/html/Shell-scripts.html

25
Khushman Patel

$? est une variable contenant la valeur de retour de la dernière commande exécutée.

Exemple de programme C (example.c):

int main() { return 1; }

Exemple Bash:

gcc -o example example.c
./example
echo $? # prints 1
35
Brendan Long

La plupart des réponses manquent un peu de détail. Une réponse définitive se trouve dans la norme POSIX pour le shell, dans la section sur les paramètres spéciaux :

$? Développe le statut de sortie décimal du pipeline le plus récent (voir Pipelines).

Ne soyez pas surpris par Word pipeline, car même une commande simple telle que ls est grammaticalement un pipeline consistant en une seule commande. Mais alors, qu'est-ce que $? pour un pipeline à commandes multiples? C'est l'état de sortie de la commande last du pipeline.

Et que dire des pipelines s’exécutant en arrière-plan, comme grep foo bigfile|head -n 10 > result &

Leur statut de sortie peut être récupéré via wait une fois que la dernière commande du pipeline est terminée . Le pid du processus en arrière-plan est disponible en tant que $! et $? indique uniquement si la commande en arrière-plan était correctement démarrée.

Un autre détail qui mérite d'être mentionné est que l'état de sortie est généralement compris entre 0 et 255, 128 à 255 indiquant le processus quitté en raison d'un signal. Le renvoi d'autres valeurs d'un programme C risque de ne pas être reflété avec précision dans $?.

12
Jens

C'est le code de retour de la dernière commande exécutée.

Par convention, 0 est une sortie réussie et non nul indique une sorte d'erreur.

6
evil otto

Cette variable spéciale indique l'état de sortie de la dernière commande exécutée dans un script ou une ligne de commande. Par exemple, dans une ligne de commande, l'utilisateur peut taper

 who; echo $?

La sortie serait alors

 user  tty7         2014-07-13 19:47
 0

Ceci affiche la sortie de who et le statut de sortie de la commande. Un script serait le même.

 #!/bin/bash
 who
 echo $?

Sortie: 0

1
user1744127

les autres réponses couvrent assez bien bash, mais vous ne spécifiez pas de shell dans votre question. Dans csh (et tcsh), $? peut être utilisé pour interroger l'existence de variables , par ex.

if $?my_var then
    echo my_var exists
endif
0
craq