it-swarm.com.de

Wie kann ich ein Shell-Skript auf einer Unix-Konsole oder einem Mac-Terminal ausführen?

Ich weiß es, vergesse es und lerne es wieder. Zeit, es aufzuschreiben.

483
P-A

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).

Ein Hinweis zu /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.

895
lhunath

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
76
P-A

Für die Bourne-Shell:

sh myscript.sh

Für bash:

bash myscript.sh
13
anon

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.

10
Chas. Owens

Die Dateierweiterung .command wird Terminal.app zugewiesen. Doppelklicken Sie auf eine Befehlsdatei, um diese auszuführen.

0
benwiggy

Erlauben Sie zuerst die Ausführung: -
chmod +x script_name 

  1. Wenn das Skript nicht ausführbar ist: -
    Zum Ausführen der sh-Skriptdatei: -
    sh script_name
    Zum Ausführen der Bash-Skriptdatei: -
    bash script_name
  2. Wenn das Skript ausführbar ist: -
    ./script_name

NOTE: - Sie können mit 'ls -a' prüfen, ob die Datei ausführbar ist oder nicht.

0
Vineet Jain