Antworten:
sh
Verwenden Sie zum Ausführen eines nicht ausführbaren Skripts:
sh myscript
bash
Verwenden Sie zum Ausführen eines nicht ausführbaren Skripts:
bash myscript
So starten Sie eine ausführbare Datei (eine Datei mit ausführbarer Berechtigung); Sie geben es einfach durch 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, ist der Kernel dafür verantwortlich, herauszufinden, wie sie ausgeführt werden soll. Bei Nicht-Binärdateien erfolgt dies in der ersten Zeile der Datei. Es sollte enthalten hashbang
:
#! /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 ausgeführt bash
). Anschließend wird das Skript zusammen mit allen Argumenten, die Sie dem Skript als nachfolgende Argumente gegeben haben, an das Programm übergeben (als zweites Argument).
Das bedeutet, dass jedes ausführbare Skript einen Hashbang haben sollte . Wenn dies nicht der Fall ist, sagen Sie dem Kernel nicht, was es ist , und daher weiß der Kernel nicht, mit welchem Programm er es interpretieren soll. Es könnte sein bash
, perl
, python
, sh
, oder etwas anderes. (In der Realität verwendet der Kernel häufig die Standard-Shell des Benutzers, um die Datei zu interpretieren. Dies ist sehr gefährlich, da er möglicherweise überhaupt nicht der richtige Interpreter ist oder einige davon analysieren kann, jedoch subtile Verhaltensunterschiede aufweist der Fall zwischen sh
und bash
).
/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 es ist nicht immer in verfügbar /bin
. Während dies normalerweise auf Linux-Computern der Fall ist, gibt es eine Reihe anderer POSIX-Computer, auf denen bash
Schiffe an verschiedenen Orten ausgeliefert werden, 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 Speicherort des bash
Programms fest zu codieren . POSIX hat bereits einen Mechanismus, um damit umzugehen : PATH
. Die Idee ist, dass Sie Ihre Programme in einem der Verzeichnisse installieren, in denen sich PATH
das System befindet, und dass das System Ihr Programm finden kann, wenn Sie es namentlich ausführen möchten.
Leider können Sie dies nicht einfach tun:
#!bash
Der Kernel wird (einige könnten) keine PATH
Suche für Sie durchführen. Es gibt ein Programm, das eine PATH
Suche für Sie durchführen kann, es heißt jedoch env
. Glücklicherweise ist auf fast allen Systemen ein env
Programm installiert /usr/bin
. Daher verwenden wir env
einen fest codierten Pfad, der dann nach ihm PATH
sucht bash
und ihn ausführt, damit 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 env
Programm. Das heißt, wir haben keinen Platz mehr, an den wir Argumente übergeben können bash
. Es gibt also keine Möglichkeit, so etwas #!/bin/bash -exu
in dieses Schema umzuwandeln . Sie müssen set -exu
stattdessen nach dem Hashbang setzen.
Dieser Ansatz hat noch einen weiteren Vorteil: Einige Systeme werden möglicherweise mit einem ausgeliefert /bin/bash
, aber der Benutzer mag ihn möglicherweise nicht, findet ihn möglicherweise fehlerhaft oder veraltet und hat möglicherweise seinen eigenen an einem bash
anderen Ort installiert . Dies ist häufig unter OS X (Macs) der Fall, wo Apple ein veraltetes /bin/bash
Produkt ausliefert und Benutzer /usr/local/bin/bash
mithilfe von Homebrew ein aktuelles Gerät installieren . Wenn Sie den env
Ansatz verwenden, der eine PATH
Suche durchführt, berücksichtigen Sie die Präferenzen des Benutzers und verwenden seine bevorzugte Bash gegenüber der, mit der sein System geliefert wurde.
zsh
als Shell verwenden würde, würde ich die verwenden hashbang
#! /usr/bin/env zsh
?
#! /usr/bin/env zsh
wenn (und nur wenn) der Code im Skript von der Z-Shell ausgeführt werden soll.
Für die Bourne Shell:
sh myscript.sh
Für Bash:
bash myscript.sh
Wenn Sie möchten, dass das Skript in der aktuellen Shell ausgeführt wird (z. B. möchten Sie, 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, zum Beispiel . bin/script.sh
läuft die script.sh
in dem bin
Verzeichnis unter dem aktuellen Verzeichnis.
Geben Sie zunächst die Erlaubnis zur Ausführung: -
chmod +x script_name
sh script_name
bash script_name
./script_name
HINWEIS : - Mit 'ls -a' können Sie überprüfen, ob die Datei ausführbar ist oder nicht.
Kleine Ergänzung, um einen Interpreter aus demselben Ordner auszuführen und weiterhin #! Hashbang in Skripten zu verwenden.
Als Beispiel befindet sich eine ausführbare Datei von php7.2, die aus / usr / bin kopiert wurde, in einem Ordner entlang eines Hallo- Skripts.
#!./php7.2
<?php
echo "Hello!";
Um es auszuführen:
./hello
Welche sich genauso verhalten wie:
./php7.2 hello