So starten Sie das Shell-Skript 'file.sh':
sh file.sh
bash file.sh
Eine weitere Option ist das Festlegen der Ausführungsberechtigung mit dem Befehl chmod:
chmod +x file.sh
Führen Sie nun die .sh-Datei wie folgt aus:
./file.sh
Zum Ausführen eines nicht ausführbaren sh
Skript, verwenden Sie:
sh myscript
Zum Ausführen eines nicht ausführbaren bash
Skript, verwenden Sie:
bash myscript
Um eine ausführbare Datei zu starten (das ist eine beliebige Datei mit ausführbarer Berechtigung); Sie geben es einfach über seinen Pfad an:
/foo/bar
/bin/bar
./bar
Um ein Skript ausführbar zu machen, geben Sie ihm die erforderliche Berechtigung:
chmod +x bar
./bar
Wenn eine Datei ausführbar ist, wird der Kernel ist dafür verantwortlich, herauszufinden, wie es auszuführen ist. Bei Nicht-Binärdateien erfolgt dies durch Betrachten der ersten Zeile der Datei. Es sollte einen hashbang
enthalten :
#! /usr/bin/env bash
Der Hashbang teilt dem Kernel mit, welches Programm ausgeführt werden soll (in diesem Fall der Befehl /usr/bin/env
wird mit dem Argument bash
ausgeführt ). Dann wird das Skript (als zweites Argument) zusammen mit allen Argumenten, die Sie dem Skript als nachfolgende Argumente gegeben haben, an das Programm übergeben.
Das bedeutet, dass jedes ausführbare Skript einen Hashbang haben sollte . Wenn nicht, sagen Sie dem Kernel nicht, was er ist , und daher weiß der Kernel nicht, welches Programm er verwenden soll, um ihn zu interpretieren. Es könnte bash
sein , perl
, python
, sh
, oder etwas anderes. (In Wirklichkeit verwendet der Kernel oft die Standard-Shell des Benutzers, um die Datei zu interpretieren, was sehr gefährlich ist, da es möglicherweise überhaupt nicht der richtige Interpreter ist oder in der Lage ist, einige davon zu analysieren, aber mit subtilen Verhaltensunterschieden wie z der Fall zwischen sh
und bash
).
Ein Hinweis zu /usr/bin/env
Am häufigsten sehen Sie Hash-Pony wie folgt:
#!/bin/bash
Das Ergebnis ist, dass der Kernel das Programm /bin/bash
ausführt um das Skript zu interpretieren. Leider bash
wird nicht immer standardmäßig ausgeliefert und ist nicht immer in /bin
verfügbar . Während es auf Linux-Rechnern normalerweise so ist, gibt es eine Reihe anderer POSIX-Rechner, auf denen bash
Schiffe an verschiedenen Orten, wie 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, die Position von bash
fest zu codieren Programm. POSIX hat bereits einen Mechanismus, um damit umzugehen:PATH
. Die Idee ist, dass Sie Ihre Programme in einem der Verzeichnisse installieren, die sich in PATH
befinden und das System sollte in der Lage sein, Ihr Programm anhand des Namens zu finden, wenn Sie es ausführen möchten.
Leider können Sie nicht tun Sie einfach dies:
#!bash
Der Kernel wird (einige könnten) keinen PATH
ausführen Suche nach dir. Es gibt ein Programm, das PATH
ausführen kann Suche nach Ihnen, aber es heißt env
. Glücklicherweise haben fast alle Systeme einen env
Programm installiert in /usr/bin
. Also starten wir env
Verwenden eines fest codierten Pfads, der dann einen PATH
ausführt suchen Sie nach bash
und führt es aus, damit es 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 env
Programm. Das bedeutet, dass wir keinen Platz mehr haben, um Argumente an bash
zu übergeben . Es gibt also keine Möglichkeit, so etwas wie #!/bin/bash -exu
umzuwandeln zu diesem Schema. Sie müssen set -exu
eingeben stattdessen nach dem Hashbang.
Dieser Ansatz hat noch einen weiteren Vorteil:Einige Systeme werden möglicherweise mit einem /bin/bash
ausgeliefert , aber der Benutzer mag es möglicherweise nicht, findet es möglicherweise fehlerhaft oder veraltet und hat möglicherweise sein eigenes bash
installiert irgendwo anders. Dies ist häufig unter OS X (Macs) der Fall, wo Apple ein veraltetes /bin/bash
ausliefert und Benutzer installieren einen aktuellen /usr/local/bin/bash
mit etwas wie Homebrew. Wenn Sie den env
verwenden Ansatz, der einen PATH
ausführt suchen, berücksichtigen Sie die Vorlieben des Benutzers und verwenden seine bevorzugte Bash gegenüber der, mit der sein System ausgeliefert wurde.
Für die Bourne-Shell:
sh myscript.sh
Für bash:
bash myscript.sh