Ich habe einige Bash-Skripte, die ich eingerichtet habe und die meistens verwenden
#!/bin/bash
aber ich stoße regelmäßig auf solche, die aussehen
#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex
und so weiter.
Kann jemand die Bedeutung und den Nutzen dieser Shebang-Optionen erklären und ob sie für andere Shebangs gelten?
Antworten:
Beginnt ein Skript
/path/to/foo
mit#!/bin/bash
,/path/to/foo arg1 arg2
entspricht die Ausführung der Ausführung/bin/bash /path/too/foo arg1 arg2
. Wenn die Shebang-Linie ist#!/bin/bash -ex
, ist es gleichbedeutend mit der Ausführung/bin/bash -ex /path/too/foo arg1 arg2
. Diese Funktion wird vom Kernel verwaltet.Beachten Sie, dass Sie möglicherweise nur ein Argument in der shebang-Zeile haben: Einige Unices (wie z. B. Linux) akzeptieren nur ein Argument. Dies
#!/bin/bash -e -x
würde dazu führen, dass bash das einzige fünfstellige Argument-e -x
(ein Syntaxfehler) anstelle von zwei Argumenten-e
und empfängt-x
.Für die Bourne-Shell
sh
und abgeleitete Shells wie POSIX sh, bash, ksh und zsh:-e
bedeutet, dass das Skript sofort beendet wird, wenn ein Befehl fehlschlägt (was durch Zurückgeben eines Nicht-Null-Status angezeigt wird).-x
Bewirkt, dass die Shell einen Ausführungs-Trace ausgibt.Andere Programme verstehen diese Optionen möglicherweise, haben jedoch andere Bedeutungen.
quelle
Sie sind Optionen übergeben
bash
siehehelp set
für weitere Informationen, in diesem Fall:quelle
-ex
macht beidesman bash
):In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...]
.Ich möchte nur eine noch bessere - wie auch tragbarere - Alternative erwähnen:
Das obige Beispiel verwendet
env
, um diebash
ausführbare Datei zu finden , die nicht immer auf ist/bin/bash
. Ye Olde#!/bin/bash
Skripte funktionieren nicht auf NixOS , zum Beispiel.Wenn Sie
env
wie oben gezeigt verwenden, können Sie (soweit mir bekannt) kein Argument wie-e
tobash
angeben. Aber Sie können dies stattdessen tun:quelle
env
Verwendung ist besonders für Skripte, die Python ausführen, nicht gut, da Sie einfach nicht wissen, ob die Standardversionpython
2 oder 3 ist, und das macht einen großen Unterschied für Skripte, die eine bestimmte Version benötigen. Besser explizit als schlau