Wie führe ich ein Bash-Skript in Terminal aus?

108

Ich habe ein Bash-Skript wie:

#!/bin/bash

echo Hello world!

Wie führe ich das im Terminal aus?

Ballon
quelle
27
Hat es Ausführungsberechtigungen? Versuchen Sie es chmod +x scriptnameund dann ./scriptname.
dirkgently

Antworten:

49

$prompt: /path/to/scriptund drücken Sie die Eingabetaste. Beachten Sie, dass Sie sicherstellen müssen, dass das Skript über Ausführungsberechtigungen verfügt.

prodigitalson
quelle
1
Wenn Sie sich bereits im /path/to Verzeichnis befinden, z. B. mit dem cd /path/toBefehl, können Sie eingeben ./script, um Ihr Skript auszuführen. Vergessen Sie nicht, in diesem Fall das './' vor 'script'
FrViPofm
120

Noch eine andere Möglichkeit, es auszuführen (diesmal ohne Festlegen von Ausführungsberechtigungen):

bash /path/to/scriptname
Bis auf weiteres angehalten.
quelle
26

CD in das Verzeichnis, das das Skript enthält, oder legen Sie es in einem bin-Ordner ab, der sich in Ihrem $ PATH befindet

Geben Sie dann ein

./scriptname.sh

wenn im selben Verzeichnis oder

scriptname.sh

wenn es im bin-Ordner ist.

John Boker
quelle
9
Dies funktioniert nur, wenn für das Skript das Ausführungsbit gesetzt ist. Das muss wahrscheinlich angegangen werden.
Bryan Oakley
./scriptname.shfunktioniert bei mir aber scriptname.shgibt scriptname.sh: command not found. -rwxr-xr-xsind seine Berechtigungen.
Spikatrix
1
Der Rat an cdirgendwo überhaupt führt zu einem weiteren häufigen Missverständnis für Anfänger. Sofern das Skript nicht intern Abhängigkeiten aufweist, für die es in einem bestimmten Verzeichnis ausgeführt werden muss (z. B. das Lesen einer Datendatei, auf die das Skript unerklärlicherweise keine Option zum Verweisen bietet), sollten Sie es niemals cdirgendwo ausführen müssen, und zwar sehr wird oft nicht wollen.
Tripleee
24

Du könntest es tun:
sh scriptname.sh

xCra2yx
quelle
6
Downvote: Das ist falsch, wenn es sich richtig um ein Bash-Skript handelt.
Tripleee
1
Upvote: Dies ist in Ordnung unter Mac OS X, wenn sich Ihr Bash-Skript im selben Verzeichnis befindet
Karl Taylor
30
@kot "Es funktioniert bei mir" ist sehr weit entfernt von "das ist eine richtige Antwort". Es kann funktionieren, wenn shes sich um einen Symlink bashhandelt oder wenn das Skript kein Bash-spezifisches Konstrukt verwendet. Im ersteren Fall ist die Verwendung von bashanstelle von shdie einzig richtige, tragbare Lösung. Im letzteren Fall ist dies nicht die richtige Antwort auf diese spezielle Frage, da das OP speziell nach Ratschlägen für ein Bash-Skript gefragt hat. Die falsche Antwort zu geben ist unverantwortlich; Benutzer, die den Unterschied nicht verstehen, posten häufig hier und müssen gezeigt werden, warum diese Antwort "für mich funktioniert" für sie nicht funktioniert hat.
Tripleee
@kraftydevil auch ^ Eines von mehreren beliebten doppelten Zielen zu diesem Thema: stackoverflow.com/questions/5725296/…
Tripleee
5
@kot Ich wiederhole: Es gibt Situationen, in denen dies funktioniert (wie Sie herausgefunden haben), aber es ist im allgemeinen Fall keine korrekte Antwort auf die Frage in der Überschrift. Zumindest sollte diese Antwort die Bedingungen erklären, unter denen sie funktioniert; aber mein Vorschlag wäre, diese Antwort einfach zu löschen.
Tripleee
14

Zunächst müssen Sie es ausführbar machen mit : chmod +x name_of_your_file_script.

Nachdem Sie es ausführbar gemacht haben, können Sie es mit ausführen ./same_name_of_your_file_script

Donald Shahini
quelle
10

Ändern Sie Ihr Verzeichnis mithilfe von CD in das Verzeichnis, in dem sich das Skript befindet Befehls Speicherort des

Geben Sie dann ein

bash program-name.sh
gaurav07
quelle
6
Es besteht keine Notwendigkeit, cdirgendwo; Sie können einen beliebig komplexen Pfadnamen als Argument für angeben bash. In der Tat funktioniert jedes Programm, das ein Dateinamenargument verwendet, auf diese Weise (oder ist erschreckend, geistesgestört kaputt).
Tripleee
10

Dies ist ein alter Thread, aber ich bin darauf gestoßen und bin überrascht, dass noch niemand eine vollständige Antwort gegeben hat. Also los geht's ...

Das Tutorial zum Ausführen eines Befehlszeilenskripts!

F: Wie führe ich dies im Terminal aus?

Verwirrungen und Konflikte:

  • Sie benötigen keine 'Erweiterung' (wie .sh oder .py oder irgendetwas anderes), aber es hilft, den Überblick zu behalten. Es wird nicht weh tun. Wenn der Skriptname jedoch eine Erweiterung enthält, müssen Sie diese verwenden.
  • Sie müssen sich aus irgendeinem Grund überhaupt nicht in einem bestimmten Verzeichnis befinden.
  • Sie nicht den Namen des Programms tippen müssen, der die Datei ausgeführt wird (BASH oder Python oder was auch immer) , wenn Sie wollen. Es wird nicht weh tun.
  • Sie nicht brauchen , sudoirgendetwas davon zu tun. Dieser Befehl ist für die Ausführung von Befehlen als anderer Benutzer oder als Root-Benutzer (Administrator) reserviert. Toller Beitrag hier .

(Eine Person, die gerade das Ausführen von Skripten lernt, sollte diesen Befehl nur verwenden, wenn ein wirklicher Bedarf besteht, z. B. die Installation eines neuen Programms. Ein guter Ort zum Ablegen Ihrer Skripte befindet sich in Ihrem Ordner ~ / bin Eingabe cd ~/binoder cd $HOME/binüber die Terminal-Eingabeaufforderung. Sie haben die vollständigen Berechtigungen in diesem Ordner.)

Um dieses Skript vom Terminal auf einem System vom Typ Unix / Linux auszuführen, müssen Sie drei Dinge tun:

  1. Teilen Sie dem System den Speicherort des Skripts mit. (wähle eins)

    • Geben Sie den vollständigen Pfad mit dem Skriptnamen ein (z /path/to/script.sh. B. ). Sie können den vollständigen Pfad überprüfen, indem Sie pwdoder echo $PWDin das Terminal eingeben .
    • Aus demselben Verzeichnis ausführen und ./für den Pfad verwenden (z ./script.sh. B. ). Einfach.
    • Platzieren Sie das Skript in einem Verzeichnis auf dem System PATHund geben Sie einfach den Namen ein (z script.sh. B. ). Sie können das System überprüfen, PATHindem Sie eingeben echo $PATHoder echo -e ${PATH//:/\\n}eine übersichtlichere Liste wünschen.
  2. Teilen Sie dem System mit, dass das Skript zur Ausführung berechtigt ist. (wähle eins)

    • Setzen Sie das "Ausführungsbit", indem Sie chmod +x /path/to/script.shdas Terminal eingeben .
    • Sie können auch verwenden, chmod 755 /path/to/script.shwenn Sie Zahlen bevorzugen. Es gibt eine große Diskussion mit einem kühlen Chart hier .
  3. Teilen Sie dem System die Art des Skripts mit. (wähle eins)

    • Geben Sie den Namen des Programms vor dem Skript ein. (zB BASH /path/to/script.shoder PHP /path/to/script.php) Wenn das Skript eine Erweiterung wie .php oder .py hat, ist es Teil des Skriptnamens und Sie müssen es einschließen.
    • Verwenden Sie einen Shebang , den Sie #!/bin/bashin Ihrem Beispiel haben ( ). Wenn Sie dies als erste Zeile Ihres Skripts haben, verwendet das System dieses Programm, um das Skript auszuführen. Sie müssen keine Programme eingeben oder Erweiterungen verwenden.
    • Verwenden Sie einen "tragbaren" Shebang . Sie können das System auch die Version des Programms auswählen lassen, die zuerst im Programm angezeigt wird PATH, #!/usr/bin/envgefolgt vom Programmnamen (z . B. #!/usr/bin/env bashoder #!/usr/bin/env python3). Es gibt Vor- und Nachteile, die hier ausführlich besprochen werden .
Michael Treanor
quelle
1
Ziemlich gute Zusammenfassung. Vielleicht erinnern die Leute im letzten Beispiel daran, dass script.shund script.phpsind die wörtlichen Dateinamen dieser Skripte, und wenn Sie eine Erweiterung in den Dateinamen einfügen, müssen Sie diese beim Ausführen des Skripts einschließen (und umgekehrt; wenn das Skript dies nicht tut). keine Erweiterung haben, keine setzen). Dies ist anders als z. B. unter DOS, wo Sie den .batoder .exeaus dem Dateinamen weglassen können und Dateien eine Erweiterung aus einem kleinen Satz benötigen, um als ausführbar zu gelten.
Tripleee
1
Ein weiterer häufiger Anfängerfehler ist Mißverständnis den Unterschied zwischen path, /path, ./pathund ~/path. Ich denke, du willst es hier wahrscheinlich nicht erklären, aber vielleicht verlinkst du es mit einer Erklärung wie ... oh verdammt, ich musste das posten .
Tripleee
1

Und noch ein Weg

. /path/to/script

Was bedeutet der Punkt?

Iss bei Joes
quelle
Dadurch wird das Skript in der aktuellen Shell ausgeführt, die aufgerufen werden muss. Dies ist nicht das, was die meisten Leute erwarten, wenn Sie einfach ein Skript ausführen. Dies kann Nebenwirkungen auf Ihre vorhandene Umgebung haben.
Software Engineer
-2

Wenn Sie sich in einem Verzeichnis oder Ordner befinden, in dem die Skriptdatei verfügbar ist, ändern Sie einfach die Dateiberechtigung im ausführbaren Modus

chmod +x your_filename.sh

Danach führen Sie das Skript mit dem folgenden Befehl aus.

$ sudo ./your_filename.sh

Über "." repräsentieren das aktuelle Verzeichnis. Hinweis! Wenn Sie sich nicht in dem Verzeichnis befinden, in dem sich die Bash-Skriptdatei befindet, ändern Sie das Verzeichnis, in dem sich die Datei befindet, mithilfe von

cd Directory_name/write the complete path

Befehl. Andernfalls kann Ihr Skript nicht ausgeführt werden.

Hassan Shamshir
quelle
Ich hoffe, dass alle dies tun werden, da ich das gesamte zugehörige Konzept zu diesem speziellen Problem erwähne.
Hassan Shamshir
Wie in anderen Antworten hier erläutert, sudoist es falsch und möglicherweise schrecklich falsch, wenn Sie es in einem nicht vertrauenswürdigen Skript verwenden, das die Kräfte missbraucht, die Sie ihm unnötig gegeben haben.
Tripleee
Der Rat an cdirgendwo ist schwer zu verstehen, aber wahrscheinlich auch falsch.
Tripleee