Que fait le -e dans un shebang bash?

32

J'ai un script bash avec les éléments suivants:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

Ce script ne fonctionnera pas sans le -e. Que fait le -escript? Aussi, que fait le $?dans ce contexte?

Chris Henry
la source
1
Impair. Non -edans la page de manuel (je veux vraiment voir une réponse pour répondre à cela). $?contient le dernier code de sortie (celui du egrepprocessus généré ci-dessus).
2
@pst: -eest documenté sous set.
Greg Hewgill
Vous pouvez simplifier votre script en faisant ceci:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan
2
Vous manquez un espace entre ifet [. Ce script ne fonctionne pas avec -e , parce que si grepne trouve rien alors sous -ele script mettra fin là. Sans -e, vous avez le message en arrière: un statut ( $?) de 0 signifie que grep a trouvé l'utilisateur. Notez que cela devrait être `grep '^ username:', au fait (et s'il y a un autre utilisateur avec un nom plus long?).
Gilles 'SO- arrête d'être méchant'
3
Aura #/bin/bash -ele même effet qu'à la #/bin/bashligne # 1 et set -eà la ligne # 2?
blong

Réponses:

34

Erreur de sortie. Plus de drapeaux

S'il y a une erreur, elle s'arrêtera immédiatement.

Le $? est l'état de sortie de la commande passée. Sous Linux, un état de sortie de 0 signifie que la commande a réussi. Tout autre statut signifierait qu'une erreur s'est produite.

egrep "^ username" / etc / passwd> / dev / null Recherchez le nom d'utilisateur sous le fichier / etc / passwd. S'il le trouve, l'état de sortie $? sera égal à 0. S'il ne le trouve pas, le statut de sortie sera autre chose (pas 0), par conséquent vous "écho n'existe pas".


la source
De plus, vous pouvez faire fonctionner le script correctement sans -e en remplaçant les deux premières lignes par if egrep "^username" /etc/passwd >/dev/null.
1
Pourquoi n'est-il pas setnécessaire cependant? : - /
1
@pst: Parce que le -eest donné à bash comme argument de ligne de commande. Toutes les options répertoriées sous setsont également acceptées par bash dans sa ligne de commande - notez la première phrase de la section Options de la page de manuel.
grawity
14

Tous les commutateurs de ligne de commande bash sont documentés dans man bash.

      -e Quittez immédiatement si un pipeline (qui peut consister en un
              commande simple simple), une commande de sous-shell incluse dans
              parenthèses ou l'une des commandes exécutées dans le cadre de
              une liste de commandes entourée d'accolades (voir SHELL GRAMMAR
              ci-dessus) sort avec un statut différent de zéro. La coque ne
              quitter si la commande qui échoue fait partie de la commande
              liste immédiatement après un mot clé while ou until,
              partie du test suivant le if ou elif réservé
              mots, partie d'une commande exécutée dans un && ou || liste
              à l'exception de la commande suivant le && ou || final, tout
              commande dans un pipeline mais le dernier, ou si la commande
              la valeur de retour est inversée avec!. Un piège sur ERR,
              s'il est défini, il est exécuté avant la fermeture du shell. Cette option
              s’applique à l’environnement shell et à chaque envi-
              séparément (voir ENVIRONNEMENT D'EXÉCUTION DES COMMANDES
              ci-dessus) et peut entraîner la fermeture des sous-coquilles avant l'exécution
              toutes les commandes du sous-shell.
Greg Hewgill
la source
2
Ahh Je l'ai cherché chez l'homme, mais après avoir trouvé -e dans le fichier tests et no -e sous les principaux arguments, j'ai abandonné. Bel extrait. Pourquoi n'est-il pas setnécessaire cependant? : - /
1

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, a trouvé la chaîne". état de sortie! = 0 signifie que quelque chose ne va pas, dans le cas de grep 1 signifie "non trouvé", 2 signifie "ne peut pas ouvrir l'entrée" ...

jm666
la source