GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie führe ich ein Shell-Skript auf einer Unix-Konsole oder einem Mac-Terminal aus?

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

Linux
  1. Wie führe ich Linux-Bash-Befehle in einem PERL-Skript aus?

  2. Wie löst man einen Hostnamen in eine IP-Adresse in einem Bash-Skript auf?

  3. Wie überprüfe ich die Teilzeichenfolge in Shell Script Bash?

  4. Wie führe ich ein Shell-Skript im Hintergrund aus?

  5. So führen Sie Python-Skripte von der Shell aus

So führen Sie ein Bash-Skript aus {7 Methoden}

So führen Sie einen Linux-Shell-Befehl / ein Skript im Hintergrund aus

So führen Sie Shell-Skript als SystemD-Dienst in Linux aus

So führen Sie ein Bash-Skript aus

So erstellen und führen Sie ein Shell-Skript in Ubuntu 22.04 aus

Wie führen Sie ein Skript beim Anmelden in * nix aus?