webentwicklung-frage-antwort-db.com.de

Was ist die Dateiendung Bash?

Ich habe ein Bash-Skript in einem Texteditor geschrieben. Mit welcher Erweiterung speichere ich mein Skript, damit es als Bash-Skript ausgeführt werden kann? Ich habe ein Skript erstellt, das theoretisch einen SSH-Server starten sollte. Ich frage mich, wie das Skript ausgeführt werden soll, wenn ich es anklicke. Ich verwende OS X 10.9.5. 

50
Amedeo

Wenn Sie mit den anderen Antworten nicht einverstanden sind, gibt es eine übliche Konvention, eine .sh-Erweiterung für Shell-Skripts zu verwenden. Dies ist jedoch keine nützliche Konvention. Es ist besser, überhaupt keine Erweiterung zu verwenden. Der Vorteil der Tatsache, dass foo.sh ein Shell-Skript ist, ist aufgrund seines Namens minimal, und Sie zahlen dafür mit einem Verlust an Flexibilität.

Um ein Bash-Skript ausführbar zu machen, muss es oben eine Shebang -Zeile haben:

#!/bin/bash

und verwenden Sie den Befehl chmod +x, damit das System es als ausführbare Datei erkennt. Es muss dann in einem der Verzeichnisse installiert werden, die in Ihrem $PATH aufgeführt sind. Wenn das Skript foo heißt, können Sie es von einer Shell-Eingabeaufforderung aus ausführen, indem Sie foo eingeben. Wenn es sich im aktuellen Verzeichnis befindet (üblich für temporäre Skripts), können Sie ./foo eingeben.

Weder die Shell noch das Betriebssystem berücksichtigen den Erweiterungsteil des Dateinamens. Es ist nur ein Teil des Namens. Indem Sie not eine spezielle Erweiterung geben, stellen Sie sicher, dass sich jeder (entweder ein Benutzer oder ein anderes Skript), das es verwendet, nicht darum kümmern muss, wie es implementiert wurde, ob es ein Shell-Skript ist (sh, bash, csh) oder was auch immer), ein Perl-, Python- oder Awk-Skript oder eine binäre ausführbare Datei. Das System ist speziell so konzipiert, dass entweder ein interpretiertes Skript oder eine binäre ausführbare Datei aufgerufen werden kann, ohne zu wissen, wie es implementiert wird.

UNIX-ähnliche Systeme begannen mit einer rein textlichen Befehlszeilenschnittstelle. GUIs wie KDE und Gnome wurden später hinzugefügt. In einem GUI-Desktop-System können Sie normalerweise ein Programm ausführen (wiederum ein Skript oder eine binäre ausführbare Datei), indem Sie beispielsweise auf ein Symbol doppelklicken, das darauf verweist. Normalerweise werden dadurch alle Ausgaben verworfen, die das Programm möglicherweise druckt, und Sie können keine Befehlszeilenargumente übergeben. Es ist viel weniger flexibel als das Ausführen von einer Shell-Eingabeaufforderung. Für einige Programme (meistens GUI-Clients) kann dies jedoch praktischer sein.

Shell-Scripting lernt man am besten von der Kommandozeile, nicht von einer GUI.

(Einige Tools do beachten Dateierweiterungen. Beispielsweise verwenden Compiler normalerweise die Erweiterung, um die Sprache zu bestimmen, in der der Code geschrieben ist: .c für C, .cpp für C++ usw.). Diese Konvention gilt nicht für ausführbare Dateien Dateien.)

Beachten Sie, dass UNIX (und UNIX-ähnliche Systeme) nicht Windows sind. MS Windows verwendet im Allgemeinen die Dateierweiterung, um zu bestimmen, wie die Datei geöffnet/ausgeführt wird. Binäre ausführbare Dateien müssen die Erweiterung .exe haben. Wenn Sie unter Windows eine UNIX-artige Shell installiert haben, können Sie Windows so konfigurieren, dass eine .sh-Erweiterung als Shell-Skript erkannt wird, und die Shell zum Öffnen verwenden. Windows hat nicht die #!-Konvention.

55
Keith Thompson

Sie benötigen keine Erweiterung (oder Sie können eine beliebige auswählen, aber .sh ist eine nützliche Konvention).

Sie sollten Ihr Skript mit #!/bin/bash starten (diese erste Zeile wird von execve (2) syscall verstanden), und Sie sollten Ihre Datei durch chmod u+x ausführbar machen. Wenn sich Ihr Skript in einer Datei befindet, müssen Sie $HOME/somedir/somescriptname.sh einmal eingeben

 chmod u+x  $HOME/somedir/somescriptname.sh

in einem Terminal. Siehe chmod (1) für den Befehl und chmod (2) für den Systemaufruf.

Sofern Sie nicht den gesamten Dateipfad eingeben, sollten Sie diese Datei in einem Verzeichnis ablegen, das in Ihrem PATHangegeben ist (siehe environ (7) & execvp (3) ) wird möglicherweise dauerhaft in Ihrem ~/.bashrc festgelegt, wenn Ihre Login-Shell bashlautet.)

Übrigens könnten Sie Ihr Skript in einer anderen Sprache schreiben, z. in Python durch Starten mit #!/usr/bin/python oder in Ocaml durch Starten mit #!/usr/bin/ocaml...

Das Ausführen Ihres Skripts durch Doppelklicken (auf das, was Sie nicht gesagt haben!) Ist ein Desktop-Umgebung Problem und kann desktop-spezifisch sein (kann bei Kde, Mate, Gnome, .... oder anders sein) IceWM oder RatPoison). Vielleicht hilft Ihnen das Lesen von EWMH spec, ein besseres Bild zu bekommen.

Wenn Sie Ihr Skript mit chmodausführbar machen, kann es möglicherweise auf Ihrem Desktop angeklickt werden (anscheinend Quartz unter MacOSX). Aber dann solltest du wahrscheinlich ein visuelles Feedback geben.

Und mehrere Computer haben keinen Desktop, einschließlich Ihres eigenen, wenn Sie mit ssh remote darauf zugreifen.

Ich halte es nicht für eine gute Idee, Ihr Shell-Skript durch Klicken auf auszuführen. Sie möchten wahrscheinlich in der Lage sein, Ihrem Shell-Skript Argumente zu geben (und wie würden Sie das durch Klicken tun?), Und Sie sollten sich um die Ausgabe kümmern. Wenn Sie ein Shell-Skript schreiben können, können Sie eine interaktive Shell in einem Terminal verwenden. Dass es die beste und natürlichste Art ist, ein Skript zu verwenden. Gute interaktive Shells (z. B. zsh oder fish oder vielleicht ein neuer bashname__) haben köstliche und konfigurierbare autocompletion Funktionen, und Sie müssen a nicht eingeben lot (lerne den Umgang mit dem tab Taste Ihrer Tastatur). Außerdem sind Skripte und Programme häufig Teile von zusammengesetzten Befehlen (Pipelines usw.).

PS. Ich benutze Unix seit 1986 und Linux seit 1993. Ich habe niemals meine eigenen Programme oder Skripte durch Klicken gestartet. Warum sollte ich?

15

Ich weiß, das ist jetzt ziemlich alt, aber ich fühle, dass dies zu dem beiträgt, was die Frage verlangt. 

Wenn Sie sich auf einem Mac befinden und ein Skript durch Doppelklicken ausführen möchten, müssen Sie die Erweiterung .command verwenden. Auch wie zuvor, machen Sie die Datei mit chmod -x ausführbar. 

Wie bereits erwähnt, ist dies nicht wirklich nützlich.

2
w_jay

einfach .sh.

Führen Sie das Skript folgendermaßen aus:

./script.sh

EDIT: Wie Anubhava sagte, die Erweiterung spielt keine Rolle. Aus organisatorischen Gründen empfiehlt es sich jedoch, Erweiterungen zu verwenden.

2

TL; DR - Wenn der Benutzer (nicht unbedingt der Entwickler) des Skripts eine GUI-Schnittstelle verwendet, hängt es davon ab, welchen Dateibrowser er verwendet. MacOS Finder benötigt die Erweiterung .sh, um das Skript auszuführen. Gnome Nautilus erkennt jedoch korrekt bearbeitete Skripte mit oder ohne die Erweiterung .sh.

Ich weiß, es wurden bereits mehrmals die Gründe für und gegen die Verwendung einer Erweiterung für Bash-Skripten genannt, aber nicht so oft, warum oder warum nicht, um Erweiterungen zu verwenden, aber ich habe, was ich für eine gute Faustregel halte.

Wenn Sie der Typ sind, der in bash ein - und aussteigt und das Terminal allgemein verwendet, oder ein Werkzeug für jemanden entwickeln, der das Terminal nicht verwendet, fügen Sie den bash - Skripten eine Erweiterung .sh hinzu. Auf diese Weise haben Benutzer dieses Skripts die Möglichkeit, in einem GUI-Dateibrowser auf diese Datei zu doppelklicken, um das Skript auszuführen.

Wenn Sie der Typ sind, der hauptsächlich Ihre Arbeit oder den Großteil Ihrer Arbeit im Terminal erledigt, sollten Sie sich keine Mühe machen, Ihre Bash-Skripte mit einer Erweiterung zu versehen. Sie würden im Terminal keinen Zweck haben, vorausgesetzt, Sie haben Ihre ~/.bashrc-Datei bereits eingerichtet, um Skripte visuell von Verzeichnissen zu unterscheiden.

Bearbeiten:

Im Gnome Nautilus-Dateibrowser mit 4 Testdateien (jeweils mit Berechtigungen für die auszuführende Datei) mit dummem einfachen Bash-Befehl zum Öffnen eines Terminalfensters (gnome-terminal):

  1. Eine Datei ohne Erweiterung mit #!/bin/bash in der ersten Zeile.

    Es funktionierte durch einen Doppelklick auf die Datei.

  2. Eine Datei mit der Erweiterung .sh mit #!/bin/bash in der ersten Zeile.

    Es funktionierte durch einen Doppelklick auf die Datei.

  3. Eine Datei mit der Erweiterung NO mit NO #!/bin/bash in der ersten Zeile.

    Es funktionierte durch einen Doppelklick auf die Datei ... technisch, aber die GUI gab keinen Hinweis darauf, dass es sich um ein Shell-Skript handelt. Es sagte, es sei nur eine reine Textdatei.

  4. Eine Datei mit der Erweiterung .sh mit NO #!/bin/bash in der ersten Zeile.

    Es funktionierte durch einen Doppelklick auf die Datei.

Wie Keith Thompson in den Kommentaren dieser Antwort jedoch weise darauf hinweist, dass die Verwendung der Erweiterung .sh anstelle des bash Shebang in der ersten Zeile der Datei (#!/bin/bash) die Ursache sein kann, kann dies zu Problemen führen.

Ich erinnere mich jedoch, als ich zuvor MacOS verwendet habe, dass auch Bash-Skripts ohne eine Erweiterung von .sh nicht ordnungsgemäß von der GUI unter MacOS ausgeführt werden konnten (ist das ein Wort?). Ich würde mich jedoch freuen, wenn mich jemand in den Kommentaren korrigiert. Wenn dies zutrifft, würde dies beweisen, dass es mindestens einen Dateibrowser gibt, in dem die Erweiterung .sh von Bedeutung ist.

0
Ryan Hart