Sollte ich alle meine Skripte mit den Dateierweiterungen * .sh und * .rb versehen?

20

Ich habe eine Reihe von handgerollten ausführbaren Skripten in meinem Verzeichnis $ HOME / bin. Einige sind in Bash geschrieben, andere in Ruby. Alle haben die Shebang-Linie oben, die der Shell sagt, welcher Interpreter verwendet werden soll (in meinem Fall Bash oder Ruby).

Ich frage mich, ob es besser ist, diesen Skripten Dateierweiterungen hinzuzufügen, um anzugeben, in welcher Skriptsprache sie geschrieben sind. Beispielsweise hätten die Skripte in Ruby das Suffix * .rb und die Bash-Skripte das Suffix * .sh.

Derzeit haben diese Skripte nur einfache Namen ohne Dateierweiterung.

Was ist die beste Vorgehensweise?

Dan
quelle
1
Es ist einfach genug, mit einem einfachen Skript von Shebang zu Extension und zurück zu konvertieren. Probieren Sie es aus und beheben Sie es später, falls erforderlich.
Aaron J Lang

Antworten:

9

Sie können Platzhalterbefehle ausführen, wie z. B. ls *.rboder cp *.shwenn Sie Ihre Skripte in Zukunft organisieren möchten.

Nach meiner Meinung früh anfangen oder später bereuen.

Editoren wie vimkönnen auch die korrekte Syntaxhervorhebung basierend auf shebang oder Dateierweiterung anwenden .

Dies kann auch durch die Verwendung von Modelines in verschiedenen Editoren erreicht werden. ZB für vim:

# vim: ft=sh
Jin
quelle
2
IMHO, Organisation wird besser durch die Funktion erledigt, nicht durch Details der Implementierung.
Grawity
4
@grawity: Trotzdem ist das Organisieren nach Suffix einfacher als das Greifen nach Shebang ...
Akira
Obwohl ich dem globalen Grund zustimme, sind die meisten Redakteure klug genug, um den Shebang zu lesen, um den Dateityp zu bestimmen.
Rich Homolka
10

Nun - wie die meisten Dinge im Leben: Es hängt von Ihren Bedürfnissen ab.

Sie haben angegeben, dass sich diese Skripte in einem bin-Verzeichnis befinden, und ich gehe davon aus, dass diese Skripte über die Befehlszeile aufgerufen werden sollen. Als Benutzer empfinde ich es als ärgerlich, wenn ich bla.ksh oder foo.bash eingeben muss. Auch wenn der Codierer beschließt, zu einem anderen Interpreter zu wechseln, würde sich auch der Befehlsname ändern, und ich müsste andere Skripte ergänzen, die diese Werkzeuge verwenden - sehr ärgerlich, selbst wenn Benutzer und Codierer dieselbe Person sind.

Andererseits verwende ich Erweiterungen wie .sh oder .tcl in meinen Projekterstellungsverzeichnissen. Auf diese Weise kann ich make- Funktionen verwenden, um die Dateien in ihren Zielverzeichnissen bereitzustellen. In diesem Stadium entferne ich jedoch das Dateisuffix.

ktf
quelle
6

Offensichtlich gibt es einige Unterschiede zwischen ausführbaren Dateien in binVerzeichnissen und bearbeitbaren "Quell" -Dateien.

  • Bei Quelldateien ist es hilfreich, ein Suffix zu haben, damit Sie sehen können, was ist, und einige weniger intelligente Tools zu unterstützen, die die #!Zeile nicht scannen können .
  • Für Module werden sie nur von einer Reihe verwandter Programme verwendet, die alle denselben Interpreter (oder keinen Interpreter) verwenden, und es ist üblich .pm, .shoder .soin solchen Fällen einzuschließen.
  • Bei ausführbaren Programmen ist sein Name Teil des "Programmiervertrags", über den Benutzer und andere Skripte ihn aufrufen. Es ist wichtig, dass sich der Name nicht ändert, auch wenn die Implementierung dies tut. Daher sollte der Dateiname offensichtlich kein Suffix haben

Bei einem kompilierten Programm ist der Unterschied zwischen "source" und "executable" offensichtlich: Eines enthält Quellcode, das andere enthält Maschinensprache oder interpretierten Bytecode. Im Falle eines Skripts gibt es keinen offensichtlichen Unterschied, aber der makeBefehl behält eine fiktive Trennung zwischen dem "Quellcode für ein Skript" und der "ausführbaren Version eines Skripts" bei: Sein Standard "Compiler" für "Shell-Skript" ist einfach cp.

Ich würde empfehlen, ein separates $HOME/sourceVerzeichnis zu führen, und entweder:

  • Beibehaltung eines Symlinks, wie z. B. von ln -s ../source/foo.sh $HOME/bin/foo; oder
  • Kopieren Sie sie manuell, nachdem Sie Änderungen vorgenommen (und getestet) haben install -m 755 foo.sh ../bin/foo. oder
  • Verwenden einer MakefileRegel, um eine Syntaxprüfung durchzuführen, bevor die Quelldatei von $HOME/sourcein kopiert wird$HOME/bin

Fußnote: Ein Shell-Skriptmodul kann nur von einem anderen Shell-Skript verwendet werden und ändert den internen Kontext dieses Skripts mit den Befehlen .oder den sourceeingebauten Befehlen. Dies unterscheidet sich von einem ausführbaren Skript, das (wie jedes Programm) als separater Prozess ausgeführt wird und den übergeordneten Prozess nicht ändern kann. Als grobe Konvention gehen Module ein, /usr/lib/name_of_program/name_of_module.shwährend Befehle ein gehen /usr/bin/name_of_command(ohne Suffix).

Martin
quelle
3

Es ist nicht nötig. Der Kernel ist bereits über den richtigen zu verwendenden Interpreter ( #!zeilenweise) informiert , und alle gängigen Texteditoren lesen ihn ebenfalls. Das Hinzufügen einer Erweiterung würde also nichts Sinnvolles bewirken, sondern nur die Eingabe erhöhen. Das einzige Mal, wenn ein ausführbares Programm eine Erweiterung hat, ist, wenn es irgendwie wichtig ist (für das Programm oder den Benutzer oder für beide).


Module und Bibliotheken haben dagegen fast immer Erweiterungen ( .rbfür Ruby-Module, .sofür gemeinsam genutzte ELF-Bibliotheken usw.).

Grawity
quelle
Die Frage ist nicht so sehr "Ist der Kernel in der Lage, es auszuführen, wenn ich das Suffix nicht zur Verfügung stelle", sondern "Hilft es mir?". Die Erhöhung der Anzahl der eingegebenen Zeichen ist mit der Fertigstellung irrelevant.
Akira