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.
82
bash myscript
.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.#!/bin/bash
.Antworten:
Wenn Sie mit den anderen Antworten nicht einverstanden sind, gibt es eine übliche Konvention, eine
.sh
Erweiterung für Shell-Skripte zu verwenden - aber es ist keine nützliche Konvention. Es ist besser, überhaupt keine Erweiterung zu verwenden. Der Vorteil,foo.sh
aufgrund 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 +x
Befehl, 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 wirdfoo
, können Sie es an einer Shell-Eingabeaufforderung ausführen, indem Sie Folgendes eingebenfoo
. 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.
.c
Fü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
.exe
Erweiterung haben. Wenn Sie eine UNIX-ähnliche Shell unter Windows installiert haben, können Sie Windows so konfigurieren, dass eine.sh
Erweiterung als Shell-Skript erkannt wird , und sie mithilfe der Shell öffnen. Windows hat die#!
Konvention nicht.quelle
deploy.sh
(oderdeploy.bash
) und einen Ordnerdeploy
mit zusätzlicher Bereitstellungslogik. Wenn Sie das Skript einfach umbenennen, führtdeploy
dies zu einem Namenskonflikt. Die unterschiedliche Benennung von Dateien oder Ordnern beeinträchtigt die Verwaltbarkeit und möglicherweise die Dateisortierung (ls
in Editoren usw.). Natürlich ist der Schebang am Ende die Determinante. Aber Dateierweiterungen haben ihren rechtmäßigen Platz.Deploy
diesem 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..sh
Erweiterung 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.command
Erweiterung, und es wird im Terminal ausgeführt, wenn Sie darauf doppelklicken.Sie benötigen keine Erweiterung (oder Sie können eine beliebige wählen, dies
.sh
ist 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 vonchmod u+x
. Wenn sich Ihr Skript in einer Datei befindet$HOME/somedir/somescriptname.sh
, müssen Sie es einmal eingebenchmod 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 ,~/.bashrc
wenn 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
chmod
machen, 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?
quelle
chmod +x
eher als verwendenchmod u+x
, es sei denn , es gibt einen bestimmten Grund, die Ausführbarkeit auf den Eigentümer zu beschränken.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
.command
Erweiterung verwenden. Auch wie zuvor Datei mit ausführbar machenchmod -x
.Wie bereits erwähnt, ist dies nicht wirklich nützlich.
quelle
nur
.sh
.Führen Sie das Skript folgendermaßen aus:
EDIT: Wie Anubhava sagte, ist die Erweiterung nicht wirklich wichtig. Aus organisatorischen Gründen wird jedoch weiterhin empfohlen, Erweiterungen zu verwenden.
quelle
.sh
Suffix zu einem ausführbaren Skript ist im Allgemeinen nutzlos..sh
Erweiterung (und weniger mit einer.bash
Erweiterung), aber ich bin nicht überzeugt, dass es überhaupt nützlich ist. Wenn ich ein Skript benennefoo.sh
und 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 esfoo
nenne, habe ich dieses Problem nicht.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
.sh
Erweiterung erforderlich, um das Skript ausführen zu können. Gnome Nautilus erkennt jedoch ordnungsgemäß geänderte Skripte mit oder ohne.sh
Erweiterung.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
.sh
Ihren 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
~/.bashrc
Datei 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
):Eine Datei ohne Erweiterung mit
#!/bin/bash
in der ersten Zeile.Es funktionierte durch Doppelklick auf die Datei.
Eine Datei mit der
.sh
Erweiterung#!/bin/bash
in der ersten Zeile.Es funktionierte durch Doppelklick auf die Datei.
Eine Datei ohne NO-Erweiterung mit NO
#!/bin/bash
in 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.
Eine Datei mit der
.sh
Erweiterung NO#!/bin/bash
in 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
.sh
Erweiterung 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
.sh
Erweiterung 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.sh
Erweiterung von Bedeutung ist.quelle
.sh
Suffix#!/bin/bash
in der ersten Zeile haben, wird ein GUI-Dateibrowser es verwendensh
, 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.)/bin/bash
oder aufgerufen wurde/bin/sh
(letzteres ist die Standardeinstellung für ein Skript ohne Shebang). Wenn/bin/sh
es 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ährendsh
es setztPOSIXLY_CORRECT=y
.)