Was macht der -e in einem Bash Shebang?

32

Ich habe ein Bash-Skript mit folgenden Inhalten:

#!/bin/bash -e

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

Dieses Skript wird nicht ohne das -e ausgeführt. Was macht das -efür dieses Skript? Und was macht der $?in diesem Zusammenhang?

Chris Henry
quelle
1
Ungerade. Nein -ein der Manpage (ich möchte wirklich eine Antwortadresse dazu sehen). $?enthält den letzten Exit-Code (den des egrepoben erzeugten Prozesses).
2
@pst: -eist dokumentiert unter set.
Greg Hewgill
Sie können Ihr Skript folgendermaßen vereinfachen:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan
2
Es fehlt ein Leerzeichen zwischen ifund [. Dieses Skript funktioniert nicht mit -e , da, wenn grepnichts gefunden wird, -edas Skript direkt dort beendet wird. Ohne -ehast du die Nachricht verkehrt herum: Ein status ( $?) von 0 bedeutet, dass grep den Benutzer gefunden hat. Beachten Sie, dass dies übrigens "grep" ^ username: "sein sollte (was ist, wenn es einen anderen Benutzer mit einem längeren Namen gibt?).
Gilles 'SO- hör auf böse zu sein'
3
Wirkt #/bin/bash -esich das genauso aus wie #/bin/bashin Zeile 1 und set -ein Zeile 2?
Blong

Antworten:

34

Fehler beim Beenden. Noch mehr Fahnen

Wenn ein Fehler auftritt, wird er sofort beendet.

Die $? ist der Beendigungsstatus des vorherigen Befehls. Unter Linux bedeutet der Beendigungsstatus 0, dass der Befehl erfolgreich war. Jeder andere Status würde bedeuten, dass ein Fehler aufgetreten ist.

egrep "^ Benutzername" / etc / passwd> / dev / null Sucht nach dem Benutzernamen in der Datei / etc / passwd. Wenn es es findet, wird der Exit-Status $? wird gleich 0 sein. Wenn es es nicht findet, wird der Ausgangsstatus etwas anderes sein (nicht 0), daher werden Sie "Echo existiert nicht".


quelle
Außerdem können Sie das Skript ohne das -e korrekt ausführen, indem Sie die ersten beiden Zeilen durch ersetzen if egrep "^username" /etc/passwd >/dev/null.
1
Warum ist das aber nicht seterforderlich? : - /
1
@pst: Weil das -eals Kommandozeilenargument an bash übergeben wird. Alle unter aufgelisteten Optionen setwerden auch von bash in der Befehlszeile akzeptiert - beachten Sie den ersten Satz im Abschnitt Optionen der Handbuchseite.
Grawity
14

Alle bash-Befehlszeilenoptionen sind in dokumentiert man bash.

      -e Beendet sofort, wenn eine Pipeline (die aus a
              single simple command), ein in
              Klammern oder einer der Befehle, die als Teil von ausgeführt werden
              eine Befehlsliste in geschweiften Klammern (siehe SHELL GRAMMAR
              oben) wird mit einem Status ungleich Null beendet. Die Schale tut es nicht
              exit, wenn der fehlgeschlagene Befehl Teil des Befehls ist
              Liste unmittelbar nach einer Weile oder bis Schlüsselwort,
              Teil der Prüfung nach if oder elif vorbehalten
              Wörter, Teil eines Befehls, der in einem && oder || ausgeführt wird Liste
              mit Ausnahme des Befehls nach dem letzten && oder ||, any
              Befehl in einer Pipeline, aber der letzte, oder wenn der Befehl ist
              Rückgabewert wird mit! invertiert. Eine Falle auf ERR,
              Wenn gesetzt, wird ausgeführt, bevor die Shell beendet wird. Diese Option
              gilt für die Shell-Umgebung und jede Subshell-Umgebung.
              separat reinigen (siehe BEFEHL AUSFÜHRUNGSUMGEBUNG)
              Dies kann dazu führen, dass Subshells vor der Ausführung beendet werden
              Alle Befehle in der Subshell.
Greg Hewgill
quelle
2
Ahh. Ich habe in dem Mann danach gesucht, aber nachdem ich -e in den Aktentests und -e unter den Hauptargumenten gefunden habe, habe ich aufgegeben. Schöner Auszug. Warum ist das aber nicht seterforderlich? : - /
1

Dein Skript ist falsch, weil

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

exit status 0 - mean - alles ist OK, im Falle von grep mean "OK, fand den String". exit status! = 0 bedeutet, dass etwas nicht stimmt, im Fall von grep 1 bedeutet "nicht gefunden", 2 bedeutet "Eingang kann nicht geöffnet werden" ...

jm666
quelle