Was macht der -e in einem Bash Shebang?

Ich habe ein Bash-Skript mit folgendem Inhalt:

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

Dieses Skript funktioniert nicht laufe ohne das -e. Was macht die -e für dieses Skript? Was macht die $? in diesem Zusammenhang?

Kommentare

  • Ungerade. Nein -e in der Manpage (ich möchte wirklich eine Antwortadresse sehen). $? enthält den letzten Exit-Code (den des oben erzeugten Prozesses egrep).
  • @pst: -e ist unter set dokumentiert.
  • Sie können Ihr Skript folgendermaßen vereinfachen: if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
  • Ihnen ' fehlt ein Leerzeichen zwischen if und [. Dieses Skript funktioniert ' nicht mit -e, da grep findet ' nichts, dann wird das Skript unter -e genau dort beendet. Ohne -e haben Sie ' die Nachricht rückwärts erhalten: einen Status ($?) von 0 bedeutet, dass grep den Benutzer gefunden hat. Beachten Sie, dass dies übrigens `grep ' ^ Benutzername: ' sein sollte (was ist, wenn es ' ist ein anderer Benutzer mit einem längeren Namen?).
  • Hat #/bin/bash -e den gleichen Effekt wie #/bin/bash in Zeile 1 und set -e in Zeile 2?

Antwort

Ihr Beitrag enthält tatsächlich 2 Fragen.

  1. Das Flag -e weist das Skript an, bei einem Fehler zu beenden. Weitere Flags

    Wenn ein Fehler auftritt, wird er sofort beendet.

  2. Die $? ist der Exit-Status des letzten Befehls. Unter Linux bedeutet ein Exit-Status von 0, dass der Befehl erfolgreich war. Jeder andere Status würde bedeuten, dass ein Fehler aufgetreten ist.

So wenden Sie diese Antworten auf Ihr Skript an:

egrep "^username" /etc/passwd >/dev/null 

würde in der Datei /etc/passwd nach username suchen.

  • Wenn es gefunden wird dann ist der Exit-Status $? gleich 0.

  • Wenn dies nicht der Fall ist „t finde es nicht, dass der Exit-Status etwas anderes ist (nicht 0). Hier möchten Sie den echo "doesn"t exist" Teil des ausführen Code.

Leider gibt es einen Fehler in Ihrem Skript. und Sie würden diesen Code ausführen, wenn der Benutzer existiert – ändern Sie die Zeile in

if [ $? -ne 0 ] 

, um die Logik richtig zu machen.

, wenn der Benutzer dies nicht tut „t exist, egrep gibt einen Fehler zurück c Ode, und aufgrund der Option -e wird die Shell sofort nach dieser Zeile beendet, sodass Sie diesen Teil des Codes niemals erreichen würden.

Kommentare

  • Außerdem können Sie das Skript ohne das -e korrekt ausführen, indem Sie die ersten beiden Zeilen durch if egrep "^username" /etc/passwd >/dev/null ersetzen.
  • Warum ist kein set erforderlich? : – /
  • @pst: Da die -e als Befehlszeilenargument an bash übergeben wird. Alle unter set aufgeführten Optionen werden auch von bash in der Befehlszeile akzeptiert. Beachten Sie den ersten Satz in Abschnitt Optionen des Handbuchs Seite.

Antwort

Alle Bash-Befehlszeilenoptionen sind in 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. 

Kommentare

  • Ahh. Ich habe bei dem Mann danach gesucht, aber nachdem ich -e in den Dateitests und no -e unter den Hauptargumenten gefunden hatte, gab ich auf. Schöner Auszug. Warum ist jedoch kein set erforderlich? : – /

Antwort

Ihr 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 – Mittelwert – alles ist in Ordnung, im Fall von Grep bedeutet“ OK, habe die Zeichenfolge gefunden „. exit status! = 0 bedeutet, dass etwas nicht stimmt, im Fall von grep 1 bedeutet „nicht gefunden“, 2 bedeutet „Eingang kann nicht geöffnet werden“ …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.