Was ist die Bash-Dateierweiterung?

82

Ich habe ein Bash-Skript in einem Texteditor geschrieben. Unter 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 ich das Skript ausführen kann, wenn ich darauf klicke. Ich verwende OS X 10.9.5.

Amedeo
quelle
4
Für das Shell-Skript ist keine bestimmte Erweiterung erforderlich. bash myscript
Führen Sie
7
Es ist normalerweise .sh, aber die Erweiterung muss überhaupt nicht existieren. Linux ist nicht Windows. Das Programm, das Ihr Skript interpretieren soll, wird in der ersten Zeile festgelegt #!/bin/bash. Es kann sogar Parameter enthalten.
Havenard
1
@anubhava Wie würde ich mein Skript ausführen lassen, wenn ich nur darauf doppelklicken und nicht "bash myscript" eingeben würde
Amedeo
2
@Amedeo, das Ihre Datei mit der Zeile anführen würde #!/bin/bash.
Havenard
4
Keine Erweiterungen: Befehlsnamenerweiterungen gelten als schädlich .
gniourf_gniourf

Antworten:

106

Wenn Sie mit den anderen Antworten nicht einverstanden sind, gibt es eine übliche Konvention, eine .shErweiterung für Shell-Skripte zu verwenden - aber es ist keine nützliche Konvention. Es ist besser, überhaupt keine Erweiterung zu verwenden. Der Vorteil, foo.shaufgrund seines Namens feststellen zu können, dass es sich um ein Shell-Skript handelt, ist minimal, und Sie zahlen dafür mit einem Verlust an Flexibilität.

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

#!/bin/bash

und verwenden Sie den chmod +xBefehl, damit das System ihn als ausführbare Datei erkennt. Es muss dann in einem der in Ihrem Verzeichnis aufgeführten Verzeichnisse installiert werden $PATH. Wenn das Skript aufgerufen wird foo, können Sie es an einer Shell-Eingabeaufforderung ausführen, indem Sie Folgendes eingeben foo. Oder wenn es sich im aktuellen Verzeichnis befindet (häufig für temporäre Skripte), können Sie eingeben ./foo.

Weder die Shell noch das Betriebssystem achten auf den Erweiterungsteil des Dateinamens. Es ist nur ein Teil des Namens. Und nicht eine spezielle Erweiterung zu geben, stellen Sie sicher , dass jemand (entweder ein Benutzer oder ein anderes Skript) , dass Anwendungen nicht zu kümmern hat , wie es durchgeführt wurde, ob es sich um ein Shell - Skript (sh, bash, csh, oder was auch immer) , ein Perl-, Python- oder Awk-Skript oder eine ausführbare Binärdatei. Das System ist speziell so konzipiert, dass entweder ein interpretiertes Skript oder eine ausführbare Binärdatei aufgerufen werden kann, ohne zu wissen oder sich darum zu kümmern, wie es implementiert ist.

UNIX-ähnliche Systeme begannen mit einer rein textuellen Befehlszeilenschnittstelle. GUIs wie KDE und Gnome wurden später hinzugefügt. In einem GUI-Desktop-System können Sie normalerweise ein Programm ausführen (auch hier handelt es sich um ein Skript oder eine ausführbare Binärdatei), indem Sie beispielsweise auf ein Symbol doppelklicken, das darauf verweist. In der Regel 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 über eine Shell-Eingabeaufforderung. Für einige Programme (meistens GUI-Clients) kann dies jedoch bequemer sein.

Shell-Skripte werden am besten über die Befehlszeile und nicht über eine GUI gelernt.

(Einige Werkzeuge tun achten Sie auf Dateiendungen zum Beispiel Compiler normalerweise die Erweiterung verwenden , um die Sprache der Code zu bestimmen , ist geschrieben in. .cFür C .cpp. Für C ++, usw. Diese Konvention nicht auf ausführbare Dateien gilt)

Beachten Sie, dass UNIX (und UNIX-ähnliche Systeme) kein Windows sind. MS Windows verwendet im Allgemeinen die Dateierweiterung, um zu bestimmen, wie diese geöffnet / ausgeführt werden soll. Binäre ausführbare Dateien müssen eine .exeErweiterung haben. Wenn Sie eine UNIX-ähnliche Shell unter Windows installiert haben, können Sie Windows so konfigurieren, dass eine .shErweiterung als Shell-Skript erkannt wird , und sie mithilfe der Shell öffnen. Windows hat die #!Konvention nicht.

Keith Thompson
quelle
2
Was ich anstrebe, ist das, was Sie im vierten Absatz erwähnt haben. Ausführen meines Skripts, wenn Sie auf ein Symbol klicken, das darauf verweist.
Amedeo
2
@Amedeo: Dann hängt es von Ihrer Desktop-Umgebung ab. In dem von mir verwendeten (Cinnamon unter Ubuntu) fordert mich ein Doppelklick auf das Symbol für ein ausführbares Skript auf, es in einem Terminal auszuführen, in einem Editor anzuzeigen oder ohne Terminal auszuführen. Dies geschieht unabhängig von der Dateierweiterung.
Keith Thompson
3
(Necro) Wenn Sie die Erweiterung weglassen, können Sie keinen gleichnamigen Ordner haben. So haben Sie beispielsweise deploy.sh(oder deploy.bash) und einen Ordner deploymit zusätzlicher Bereitstellungslogik. Wenn Sie das Skript einfach umbenennen, führt deploydies zu einem Namenskonflikt. Die unterschiedliche Benennung von Dateien oder Ordnern beeinträchtigt die Verwaltbarkeit und möglicherweise die Dateisortierung ( lsin Editoren usw.). Natürlich ist der Schebang am Ende die Determinante. Aber Dateierweiterungen haben ihren rechtmäßigen Platz.
Kafoso
2
@Kafoso: Ich glaube nicht, dass ich jemals das Bedürfnis hatte, ein Skript und ein Verzeichnis mit demselben Namen zu haben. In Deploydiesem Fall könnte ich das Verzeichnis aufrufen . Dies kann jedoch zu Problemen beim Kopieren in ein Dateisystem führen, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird.
Keith Thompson
2
Auf einem Mac werden durch Doppelklicken auf Dateien diese immer in der Standard-App geöffnet. Daher ist es hilfreich, eine .shErweiterung zu haben, damit das Skript in Ihrem gewünschten Editor geöffnet wird. Wenn Sie ein Skript ausführen möchten, wenn Sie darauf doppelklicken, geben Sie ihm die .commandErweiterung, und es wird im Terminal ausgeführt, wenn Sie darauf doppelklicken.
BallpointBen
17

Sie benötigen keine Erweiterung (oder Sie können eine beliebige wählen, dies .shist jedoch eine nützliche Konvention).

Sie sollten Ihr Skript mit beginnen #!/bin/bash(diese erste Zeile wird von execve (2) syscall verstanden), und Sie sollten Ihre Datei ausführbar machen von chmod u+x. Wenn sich Ihr Skript in einer Datei befindet $HOME/somedir/somescriptname.sh, müssen Sie es 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 in Ihrem Verzeichnis genannten Verzeichnis ablegen (PATH siehe environ (7) & execvp (3) ), das Sie möglicherweise dauerhaft in Ihrem Verzeichnis festlegen , ~/.bashrcwenn sich Ihre Anmeldeshell befindet. bash)

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

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

Wenn Sie Ihr Skript mit ausführbar chmodmachen, kann es möglicherweise auf Ihrem Desktop angeklickt werden (anscheinend Quartz unter MacOSX). Aber dann sollten Sie wahrscheinlich dafür sorgen, dass es ein visuelles Feedback gibt.

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

Ich glaube nicht, dass es eine gute Idee ist, Ihr Shell-Skript durch Klicken auszuführen. Sie möchten wahrscheinlich in der Lage sein, Ihrem Shell-Skript Argumente zu geben (und wie würden Sie das tun, indem Sie darauf klicken?), Und Sie sollten sich um dessen 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 neueres bash) verfügen über köstliche und konfigurierbare Funktionen zur automatischen Vervollständigung , und Sie müssen nicht viel eingeben (lernen Sie, die tabTaste Ihrer Tastatur zu verwenden). Außerdem sind Skripte und Programme häufig Teil zusammengesetzter Befehle (Pipelines usw.).

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

Basile Starynkevitch
quelle
3
Okay, ich habe mein Skript in einem Texteditor erstellt. Ich speichere die Datei auf meinem Desktop. Wenn ich auf mein Skript klicke, das auf meinem Desktop gespeichert ist, soll es tatsächlich ausgeführt werden, wenn ich darauf klicke.
Amedeo
6
Ich weiß nicht, was Ihr Desktop ist (KDE, Gnome, MATE, ...). Ich empfehle Ihnen dringend, die Befehlszeile in einem Terminal zu verwenden, insbesondere um Ihre Skripte auszuführen (Sie möchten ihnen wahrscheinlich einige Argumente geben; wie würden Sie das auf dem Desktop tun?). Wenn Sie in der Lage sind, ein Shell-Skript zu codieren, sollten Sie in der Lage sein, die Shell interaktiv in einem Terminal zu verwenden
Basile Starynkevitch
2
Mein Punkt ist, dass Sie beim Codieren eines Shell-Skripts die Gewohnheit haben sollten, eine Befehlszeile in einem Terminal zu verwenden.
Basile Starynkevitch
2
Ich verstehe das, es ist für ein Projekt, an dem ich arbeite. Ich möchte, dass das Skript ausgeführt wird, sobald Sie darauf klicken. Ich versuche zu vermeiden, Terminal zu verwenden, um das Skript auszuführen.
Amedeo
3
Ich würde chmod +xeher als verwenden chmod u+x, es sei denn , es gibt einen bestimmten Grund, die Ausführbarkeit auf den Eigentümer zu beschränken.
Keith Thompson
2

Ich weiß, dass dies jetzt ziemlich alt ist, aber ich denke, dies trägt zu dem bei, wonach die Frage gestellt wurde.

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

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

w_jay
quelle
1

nur .sh.

Führen Sie das Skript folgendermaßen aus:

./script.sh

EDIT: Wie Anubhava sagte, ist die Erweiterung nicht wirklich wichtig. Aus organisatorischen Gründen wird jedoch weiterhin empfohlen, Erweiterungen zu verwenden.

Marc Anton Dahmen
quelle
6
Wenn Sie ein Skript ausführen, haben Sie im Allgemeinen keinen Grund, sich darum zu kümmern, in was es geschrieben ist. Ein Bash-Skript und eine ausführbare Binärdatei werden auf dieselbe Weise ausgeführt. Das Hinzufügen eines .shSuffix zu einem ausführbaren Skript ist im Allgemeinen nutzlos.
Keith Thompson
1
Ja, aber wie gesagt in meiner Bearbeitung - es ist eine Konvention, Skripte zu organisieren - nicht mehr?!
Marc Anton Dahmen
4
Ich sehe viele Skripte mit einer .shErweiterung (und weniger mit einer .bashErweiterung), aber ich bin nicht überzeugt, dass es überhaupt nützlich ist. Wenn ich ein Skript benenne foo.shund mich später dazu entscheide, es in Perl erneut zu implementieren, kann ich entweder den Namen ändern (und alles bearbeiten, was es verwendet) oder es mit einer irreführenden Erweiterung belassen. Wenn ich es foonenne, habe ich dieses Problem nicht.
Keith Thompson
1

TL; DR - Wenn der Benutzer (nicht unbedingt der Entwickler) des Skripts eine GUI-Oberfläche verwendet, hängt dies davon ab, welchen Dateibrowser er verwendet. Für den MacOS Finder ist die .shErweiterung erforderlich, um das Skript ausführen zu können. Gnome Nautilus erkennt jedoch ordnungsgemäß geänderte Skripte mit oder ohne .shErweiterung.

Ich weiß, dass bereits mehrfach die Gründe für und gegen die Verwendung einer Erweiterung für Bash-Skripte genannt wurden, aber nicht so sehr, warum oder warum keine Erweiterungen verwendet werden sollten, aber ich habe eine meiner Meinung nach gute Faustregel.

Wenn Sie der Typ sind, der in Bash ein- und aussteigt und das Terminal im Allgemeinen verwendet oder ein Tool für eine andere Person entwickelt, die das Terminal nicht verwendet, fügen Sie .shIhren Bash-Skripten eine Erweiterung 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 die gesamte oder den größten Teil Ihrer Arbeit im Terminal erledigt, sollten Sie Ihre Bash-Skripte nicht erweitern. Sie würden im Terminal keinen Zweck erfüllen, vorausgesetzt, Sie haben Ihre ~/.bashrcDatei bereits so eingerichtet, dass Skripte visuell von Verzeichnissen unterschieden werden.

Bearbeiten:

Im Gnome Nautilus-Dateibrowser mit 4 Testdateien (jede mit Berechtigungen für die auszuführende Datei) mit dem blöd einfachen Befehl bash zum Öffnen eines Terminalfensters ( gnome-terminal):

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

    Es funktionierte durch Doppelklick auf die Datei.

  2. Eine Datei mit der .shErweiterung #!/bin/bashin der ersten Zeile.

    Es funktionierte durch Doppelklick auf die Datei.

  3. Eine Datei ohne NO-Erweiterung mit NO #!/bin/bashin der ersten Zeile.

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

  4. Eine Datei mit der .shErweiterung NO #!/bin/bashin der ersten Zeile.

    Es funktionierte durch Doppelklick auf die Datei.

Wie Keith Thompson in den Kommentaren dieser Antwort jedoch mit Bedacht betonte, könnte es Probleme verursachen , wenn man die .shErweiterung anstelle des Bash Shebang in der ersten Zeile der Datei ( #!/bin/bash) verwendet.

Ein anderes, ich erinnere mich jedoch, als ich zuvor MacOS verwendet habe, dass selbst richtig durchgeknallte (ist das ein Wort?) Bash-Skripte ohne .shErweiterung nicht über die GUI unter MacOS ausgeführt werden konnten. Ich würde es lieben, wenn mich jemand in den Kommentaren dazu korrigiert. Wenn dies zutrifft, würde dies beweisen, dass es mindestens einen Dateibrowser gibt, bei dem die .shErweiterung von Bedeutung ist.

Ryan Hart
quelle
Welchen GUI-Dateibrowser verwenden Sie (oder, was noch relevanter ist, was verwenden Ihre Benutzer)? Verwendet es die Erweiterung, um zu entscheiden, wie ein Skript ausgeführt werden soll?
Keith Thompson
Nun, die Plattform, auf der ich am meisten Erfahrung habe, ist MacOS. Im Finder entscheidet der Benutzer, welche Apps welcher Erweiterung zugeordnet werden sollen. Jetzt bin ich unter Linux und benutze Gnome, aber ich habe noch nicht experimentiert, wie der Nautilus-Dateibrowser von Gnome mit Dateien ohne Erweiterung interagiert.
Ryan Hart
Wenn Sie ein ausführbares Skript mit einem .shSuffix #!/bin/bashin der ersten Zeile haben, wird ein GUI-Dateibrowser es verwenden sh, um es aufzurufen (ohne den Shebang zu beachten)? Wenn ja, könnte dies einige Probleme verursachen. (Die Antwort kann für verschiedene Browser unterschiedlich sein.)
Keith Thompson
Gute Punkte dort. Ich habe meine Antwort oben mit einigen tatsächlichen Tests aktualisiert, die ich gerade durchgeführt habe.
Ryan Hart
Interessant, aber ... Sie sagten, es hat "funktioniert". Für jeden der 4 Testfälle wäre es gut zu wissen, ob er mit /bin/bashoder aufgerufen wurde /bin/sh(letzteres ist die Standardeinstellung für ein Skript ohne Shebang). Wenn /bin/shes sich um einen Symlink zu handelt /bin/bash(was ziemlich häufig vorkommt), können Sie dies anhand des Werts von erkennen $0. (Auch wenn Bash aufgerufen wird, während shes setzt POSIXLY_CORRECT=y.)
Keith Thompson