Jai un script bash avec ce qui suit:
#!/bin/bash -e egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then echo "doesn"t exist" fi
Ce script ne sera pas courir sans le -e. Que fait le -e
pour ce script? Aussi, que fait le $?
dans ce contexte?
Commentaires
Réponse
Votre message contient en fait 2 questions.
-
Lindicateur
-e
indique au script de se terminer en cas derreur. Plus dindicateursEn cas derreur, il se fermera immédiatement.
-
$?
est létat de sortie de la dernière commande. Sous Linux, un statut de sortie0
signifie que la commande a réussi. Tout autre état signifierait quune erreur sest produite.
Pour appliquer ces réponses à votre script:
egrep "^username" /etc/passwd >/dev/null
rechercherait le username
dans le fichier /etc/passwd
.
-
Sil le trouve alors létat de sortie
$?
sera égal à0
. -
Si ce nest pas le cas « Si vous ne le trouvez pas, le statut de sortie sera autre chose (et non
0
). Ici, vous voudrez exécuter la partieecho "doesn"t exist"
du code.
Malheureusement il y a une erreur dans votre script, et vous exécuteriez ce code si lutilisateur existe – changez la ligne en
if [ $? -ne 0 ]
pour obtenir la bonne logique.
Cependant si lutilisateur ne le fait pas « t exist, egrep
renverra une erreur c ode, et en raison de loption -e
, le shell se fermera immédiatement après cette ligne, vous natteindrez donc jamais cette partie du code.
Commentaires
- De plus, vous pouvez faire fonctionner correctement le script sans -e en remplaçant les deux premières lignes par
if egrep "^username" /etc/passwd >/dev/null
. - Pourquoi n’est-il pas nécessaire de
set
? : – / - @pst: Parce que
-e
est donné à bash comme argument de ligne de commande. Toutes les options listées sousset
sont également acceptées par bash dans sa ligne de commande – notez la première phrase dans la section Options du manuel page.
Réponse
Tous les commutateurs de ligne de commande bash sont documentés dans man bash
.
-e Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command"s return value is being inverted with !. A trap on ERR, if set, is executed before the shell exits. This option applies to the shell environment and each subshell envi- ronment separately (see COMMAND EXECUTION ENVIRONMENT above), and may cause subshells to exit before executing all the commands in the subshell.
Commentaires
- Ahh. Je lai cherché chez lhomme, mais après avoir trouvé -e dans le fichier tests et non -e sous les principaux arguments, jai abandonné. Bel extrait. Pourquoi n’est-il pas nécessaire de
set
? : – /
Réponse
Votre script est incorrect, car
egrep "^username" /etc/passwd >/dev/null if[ $? -eq 0 ] then #echo "doesn"t exist" # WRONG echo "the USER EXISTS" fi
état de sortie 0 – signifie – tout est OK, dans le cas de grep signifie » OK, jai trouvé la chaîne « . exit status! = 0 signifie que quelque chose ne va pas, dans le cas de grep 1 signifie « not found », 2 signifie « impossible » t open input « …
-e
dans la page de manuel (je veux vraiment voir une réponse à ce sujet).$?
contient le dernier code de sortie (celui du processusegrep
généré ci-dessus).-e
est documenté sousset
.if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
if
et[
. Ce script ne fonctionnera pas ' avec-e
, car sigrep
ne ' ne trouve rien, puis sous-e
le script se terminera juste là. Sans-e
, vous ' avez reçu le message à lenvers: un état ($?
) de 0 signifie que grep a trouvé lutilisateur. Notez que cela devrait être `grep ' ^ username: ', au fait (et sil y avait ' est un autre utilisateur avec un nom plus long?).#/bin/bash -e
aura le même effet que#/bin/bash
à la ligne n ° 1 etset -e
à la ligne n ° 2?