Qu'est-ce que «$?»? Est-ce une variable?

23

La question est assez simple. Je peux obtenir le code de sortie de la commande précédente en utilisant $?. mais qu'est ce que c'est exactement?

Je ne pense pas que ce soit une variable, car vous ne pouvez pas avoir de caractères spéciaux dans le nom de la variable autre que _.

foo?foo=10

entraînera l'erreur: foo?foo=10: command not found

Donc, si ce n'est pas une variable, qu'est-ce que c'est? Y en a-t-il d'autres comme ça?

daltonfury42
la source

Réponses:

23

Qu'Est-ce que c'est?

$? est une variable intégrée qui stocke l'état de sortie d'une commande, d'une fonction ou du script lui-même.

$?lit l'état de sortie de la dernière commande exécutée. Après le retour d'une fonction, $?donne l'état de sortie de la dernière commande exécutée dans la fonction. C'est la façon dont Bash donne aux fonctions une "valeur de retour". Il retourne 0en cas de succès ou un entier dans la plage 1 - 255d'erreur.

Y en a-t-il d'autres comme ça aussi?

Oui, il existe plusieurs de ces variables intégrées dans bash. Vous pouvez voir une liste ici . Voir: http://www.tldp.org/LDP/abs/html/exit-status.html

Ron
la source
1
Il est donc disponible uniquement en shell bash?
daltonfury42
4
@ daltonfury42 pas, tout shell qui tente d'avoir une compatibilité avec le shell Bourne soutenir (y compris dash, ksh, zshentre autres).
muru
2
csh et fish utilisent $statusdans le même but
glenn jackman
22

$?est une variable mais spéciale, c'est pourquoi les caractères spéciaux sont autorisés. ($?)Se développe jusqu'à l'état de sortie du dernier pipeline de premier plan exécuté.

Ce n'est pas le seul, le shell traite spécialement plusieurs paramètres. Ces paramètres ne peuvent être référencés; leur affectation n'est pas autorisée:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

Sources:

Sylvain Pineau
la source
2
"$*"n'est pas seulement tous les paramètres positionnels comme un seul mot, mais tous les paramètres positionnels séparés par le premier caractère de IFScomme un seul mot. Étant donné que le résultat sera sujet à une division de champ s'il n'est pas cité, l'effet est comme s'il $@était utilisé dans le cas non cité .
muru
1
Pour être sûr: $ @ et $ * sans guillemets sont identiques car ils sont tous les deux sujets à la séparation des mots. Citée, "$ @" préserve la séparation des mots des paramètres positionnels, même si un paramètre individuel contient un caractère dans IFS.
kojiro
1
Y a-t-il une référence depuis quand cela est utilisé pour les obus? Je me demande si Perl a pris ceux des scripts shell.
simbabque
Cela précède Perl de plusieurs décennies (ou au moins des années). Une grande partie de la syntaxe Perl a été influencée par la syntaxe du shell. (Perl est né en 1987, et une grande partie de cette syntaxe provient du shell Bourne original (1977). Je ne suis pas à 100% lorsque $ _ a été introduit, mais c'était presque certainement bien avant 1987.
Popup
6

$?est un paramètre shell spécial (variable).

En général, toutes les variables définies par l'utilisateur doivent être nommées en utilisant uniquement les caractères de la classe de caractères, [:alnum:]c'est-à - dire [a-zA-Z0-9_](ne peuvent pas non plus commencer par [0-9]).

En résumé, il $?existe une variable spéciale ( et il y en a plusieurs ) qui peut être considérée comme une caractéristique interne du shell lui-même qui fournit le code de sortie de la commande précédente (qu'elle ait réussi ou échoué).

Vous pouvez lire ceci pour avoir plus d'idée sur les variables.

heemayl
la source
4

$?est une variable spéciale dans bash qui contient toujours le code retour / sortie de la dernière commande exécutée.

Vous pouvez le visualiser dans un terminal en exécutant echo $?.

Les codes de retour sont dans la plage [0; 255].
Un code retour 0signifie généralement que tout va bien.
D'autres valeurs indiquent des erreurs. La plupart des applications renvoient 1des valeurs personnalisées. Si aucune commande n'a été trouvée, la variable contient généralement127

Si vous souhaitez définir cette variable sur une valeur spécifique, vous pouvez facilement le faire avec bash -c "exit 5"pour retourner par exemple le code retour 5.

Byte Commander
la source
Une fonction shell est un moyen compatible POSIX de définir l'état de sortie sans forcément bifurquer. setstatus() { return 5; }
kojiro