Que fait le -e dans un bash shebang?

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

  • Impair. Pas de -e dans la page de manuel (je veux vraiment voir une réponse à ce sujet). $? contient le dernier code de sortie (celui du processus egrep généré ci-dessus).
  • @pst: -e est documenté sous set.
  • Vous pouvez simplifier votre script en procédant comme suit: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • Il vous ' un espace entre if et [. Ce script ne fonctionnera pas ' avec -e, car si grep 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?).
  • Est-ce que #/bin/bash -e aura le même effet que #/bin/bash à la ligne n ° 1 et set -e à la ligne n ° 2?

Réponse

Votre message contient en fait 2 questions.

  1. Lindicateur -e indique au script de se terminer en cas derreur. Plus dindicateurs

    En cas derreur, il se fermera immédiatement.

  2. $? est létat de sortie de la dernière commande. Sous Linux, un statut de sortie 0 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 partie echo "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 sous set 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 « …

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *