Ich weiß es, vergesse es und lerne es wieder. Zeit, es aufzuschreiben.
Um ein nicht ausführbares sh
-Skript auszuführen, verwenden Sie:
sh myscript
Um ein nicht ausführbares bash
-Skript auszuführen, verwenden Sie:
bash myscript
Um eine ausführbare Datei zu starten (dies ist eine beliebige Datei mit ausführbarer Berechtigung); Sie geben es einfach über den Pfad an:
/foo/bar
/bin/bar
./bar
Um ein Skript ausführbar zu machen, erteilen Sie ihm die erforderliche Berechtigung:
chmod +x bar
./bar
Wenn eine Datei ausführbar ist, ist der Kernel dafür verantwortlich, herauszufinden, wie er ausgeführt werden soll. Bei Nicht-Binärdateien wird dazu die erste Zeile der Datei betrachtet. Es sollte eine hashbang
enthalten:
#! /usr/bin/env bash
Der Hashbang teilt dem Kernel mit, welches Programm ausgeführt werden soll (in diesem Fall wird der Befehl /usr/bin/env
mit dem Argument bash
ausgeführt). Anschließend wird das Skript (als zweites Argument) zusammen mit allen Argumenten, die Sie als nachfolgende Argumente angegeben haben, an das Programm übergeben.
Das heißt jedes Skript, das ausführbar ist, muss einen Hashbang haben. Wenn dies nicht der Fall ist, teilen Sie dem Kernel nicht mit, was er ist, und daher weiß der Kernel nicht, mit welchem Programm er ihn interpretiert. Es könnte bash
, Perl
, python
, sh
oder etwas anderes sein. (In der Realität wird der Kernel häufig die Standard-Shell des Benutzers verwenden, um die Datei zu interpretieren. Dies ist sehr gefährlich, da er möglicherweise nicht der richtige Interpreter ist oder einige davon parsen kann, jedoch mit geringfügigen Verhaltensunterschieden, wie sie sind der Fall zwischen sh
und bash
).
/usr/bin/env
Am häufigsten sieht man Hash-Bangs wie folgt:
#!/bin/bash
Das Ergebnis ist, dass der Kernel das Programm /bin/bash
ausführt, um das Skript zu interpretieren. Leider wird bash
nicht immer standardmäßig ausgeliefert und ist nicht immer in /bin
verfügbar. Während dies auf Linux-Maschinen normalerweise der Fall ist, gibt es eine Reihe anderer POSIX-Maschinen, an denen bash
an verschiedenen Speicherorten ausgeliefert wird, z. B. /usr/xpg/bin/bash
oder /usr/local/bin/bash
.
Um ein portables Bash-Skript zu schreiben, können wir uns daher nicht darauf verlassen, den Ort des bash
-Programms fest zu codieren. POSIX verfügt bereits über einen Mechanismus, um damit umzugehen: PATH
. Die Idee ist, dass Sie Ihre Programme in einem der Verzeichnisse in PATH
installieren, und das System sollte Ihr Programm finden können, wenn Sie es nach Namen ausführen möchten.
Leider tun Siekann nichteinfach folgendes:
#!bash
Der Kernel führt (möglicherweise) keine PATH
-Suche für Sie durch. Es gibt ein Programm, das eine PATH
-Suche für Sie durchführen kann, die jedoch env
heißt. Glücklicherweise haben fast alle Systeme ein env
-Programm in /usr/bin
installiert. Wir beginnen env
mit einem fest codierten Pfad, der dann eine PATH
-Suche nach bash
durchführt und so ausführt, dass er Ihr Skript interpretieren kann:
#!/usr/bin/env bash
Dieser Ansatz hat einen Nachteil: Laut POSIX kann der Hashbang ein Argument haben. In diesem Fall verwenden wir bash
als Argument für das Programm env
. Das heißt, wir haben keinen Platz mehr, um Argumente an bash
zu übergeben. Es gibt also keine Möglichkeit, etwas wie #!/bin/bash -exu
in dieses Schema zu konvertieren. Sie müssen stattdessen set -exu
nach dem Hashbang eingeben.
Dieser Ansatz hat auch einen weiteren Vorteil: Einige Systeme werden zwar mit einem /bin/bash
ausgeliefert, der Benutzer mag es jedoch nicht, kann feststellen, dass er fehlerhaft oder veraltet ist und möglicherweise seine eigene bash
an einem anderen Ort installiert hat. Dies ist häufig auf OS X (Macs) der Fall, wo Apple einen veralteten /bin/bash
ausliefert und Benutzer einen aktuellen /usr/local/bin/bash
mit etwas wie Homebrew installieren. Wenn Sie die env
-Methode verwenden, die eine PATH
-Suche durchführt, berücksichtigen Sie die Präferenzen des Benutzers und verwenden seine bevorzugte Bash gegenüber der von seinem System gelieferten.
So starten Sie das Shell-Skript 'file.sh':
sh file.sh
bash file.sh
Eine weitere Option ist die Berechtigung für ausführbare Dateien mit dem Befehl chmod:
chmod +x file.sh
Führen Sie nun die .sh-Datei wie folgt aus:
./file.sh
Für die Bourne-Shell:
sh myscript.sh
Für bash:
bash myscript.sh
Wenn das Skript in der aktuellen Shell ausgeführt werden soll (z. B. Sie möchten, dass es sich auf Ihr Verzeichnis oder Ihre Umgebung auswirkt), sollten Sie Folgendes sagen:
. /path/to/script.sh
oder
source /path/to/script.sh
Beachten Sie, dass /path/to/script.sh
relativ sein kann, beispielsweise . bin/script.sh
den script.sh
im Verzeichnis bin
im aktuellen Verzeichnis ausführt.
Die Dateierweiterung .command wird Terminal.app zugewiesen. Doppelklicken Sie auf eine Befehlsdatei, um diese auszuführen.
Erlauben Sie zuerst die Ausführung: -chmod +x script_name
sh script_name
bash script_name
./script_name
NOTE: - Sie können mit 'ls -a' prüfen, ob die Datei ausführbar ist oder nicht.