Que fait
echo $?
signifie en programmation shell?
shell
scripting
special-characters
Harshay Buradkar
la source
la source
Réponses:
Il s'agit de l'état de sortie de la dernière commande exécutée.
Par exemple, la commande
true
renvoie toujours un état de0
etfalse
renvoie toujours un état de1
:Depuis le manuel: (accessible en appelant
man bash
votre shell)Par convention, un statut de sortie
0
signifie succès et un statut de retour différent de zéro signifie échec. En savoir plus sur les statuts de sortie sur wikipedia .Il existe d'autres variables spéciales comme celle-ci, comme vous pouvez le voir dans ce manuel en ligne: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
la source
$
et?
sont deux paramètres distincts et$?
n'apparaissent pas dans la page de manuel bash (1).$?
renvoie la valeur de sortie de la dernière commande exécutée.echo $?
imprime cette valeur sur la console. zéro implique une exécution réussie tandis que les valeurs non nulles sont mappées à diverses raisons d'échec.Par conséquent, lors de la création de scripts; J'ai tendance à utiliser la syntaxe suivante
La comparaison doit être faite sur un pied d'égalité
0
ou non0
.** Mise à jour Basé sur le commentaire: Idéalement, vous ne devriez pas utiliser le bloc de code ci-dessus pour la comparaison, reportez-vous aux commentaires et explications @tripleee.
la source
cmd; if [ $? -eq 0 ]; then
devrait être refactoriséif cmd; then
. Le but même deif
(et des autres instructions de contrôle de flux dans le shell) est d'exécuter une commande et d'examiner son état de sortie.if cmd;
certaines conditions peuvent ne pas être très lisibles, en particulier lorsque cmd fait référence à un autre script.[ 1 ]
et[ 0 ]
sont tous les deux vrais;[
sans opérateur vérifie si l'argument est une chaîne non vide.vendor/bin/drush status bootstrap | grep -q $(vendor/bin/drush php-eval 'if (function_exists("t")) echo t("Successful");') &> /dev/null;
. Si je devais mettre cela sur une seule ligne,if [ ... ]
ce serait terriblement illisible. Je prévois de stocker la sortie de cette ligne dans une variable afin que je puisse le direif [ $drupal_installed -eq 0 ]
plus tard.echo $? - Donne le STATUT DE SORTIE de la dernière commande exécutée . Ce STATUT DE SORTIE serait très probablement un nombre avec ZERO indiquant le succès et toute valeur NON-ZERO indiquant l' échec
? - Ceci est un paramètre / variable spécial dans bash.
$? - Il donne la valeur stockée dans la variable "?".
Certains paramètres spéciaux similaires dans BASH sont 1,2, *, # (normalement vu dans la commande echo comme $ 1, $ 2, $ *, $ #, etc.,).
la source
Il a le dernier code d'état (valeur de sortie) d'une commande.
la source
Exemple d'état de sortie POSIX C minimal
Pour comprendre
$?
, vous devez d'abord comprendre le concept de statut de sortie de processus qui est défini par POSIX . Sous Linux:lorsqu'un processus appelle l'
exit
appel système, le noyau stocke la valeur passée à l'appel système (unint
) même après la mort du processus.L'appel système de sortie est appelé par la
exit()
fonction ANSI C et indirectement lorsque vous le faites àreturn
partir demain
.le processus qui a appelé le processus enfant sortant (Bash), souvent avec
fork
+exec
, peut récupérer le statut de sortie de l'enfant avec l'wait
appel systèmeConsidérez le code Bash:
L '«équivalent» C est:
faux.c
bash.c
Compilez et exécutez:
Production:
Dans Bash, lorsque vous appuyez sur Entrée, un fork + exec + wait se produit comme ci-dessus, et bash définit ensuite
$?
l'état de sortie du processus forké.Remarque: pour les commandes intégrées comme
echo
, un processus n'a pas besoin d'être généré, et Bash se règle simplement$?
sur 0 pour simuler un processus externe.Normes et documentation
POSIX 7 2.5.2 "Paramètres spéciaux" http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 :
man bash
"Paramètres spéciaux":ANSI C et POSIX recommandent alors que:
0
signifie que le programme a réussiautres valeurs: le programme a échoué d'une manière ou d'une autre.
La valeur exacte peut indiquer le type de panne.
ANSI C ne définit pas la signification des vaues, et POSIX spécifie des valeurs supérieures à 125: Quelle est la signification de "POSIX"?
Bash utilise l'état de sortie pour
if
Dans Bash, nous utilisons souvent le statut de sortie
$?
implicitement pour contrôler lesif
instructions comme dans:où
true
est un programme qui renvoie simplement 0.Ce qui précède est équivalent à:
Et en:
[
est juste un programme avec un nom étrange (et intégré à Bash qui se comporte comme lui), et1 = 1 ]
ses arguments, voir aussi: Différence entre les crochets simples et doubles dans Bashla source
De http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
la source
Voir le manuel Bash sous 3.4.2 Paramètres spéciaux :
C'est un peu difficile à trouver car il n'est pas répertorié comme
$?
(le nom de la variable est "juste"?
). Voir aussi la section sur l' état de sortie , bien sûr ;-)Bon codage.
la source
Affiche le résultat de la dernière commande unix exécutée
la source