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?
bash
script
shell-script
Dan
quelle
quelle
Antworten:
Sie können Platzhalterbefehle ausführen, wie z. B.
ls *.rb
odercp *.sh
wenn Sie Ihre Skripte in Zukunft organisieren möchten.Nach meiner Meinung früh anfangen oder später bereuen.
Editoren wie
vim
kö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:
quelle
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.
quelle
Offensichtlich gibt es einige Unterschiede zwischen ausführbaren Dateien in
bin
Verzeichnissen und bearbeitbaren "Quell" -Dateien.#!
Zeile nicht scannen können ..pm
,.sh
oder.so
in solchen Fällen einzuschließen.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
make
Befehl 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 einfachcp
.Ich würde empfehlen, ein separates
$HOME/source
Verzeichnis zu führen, und entweder:ln -s ../source/foo.sh $HOME/bin/foo
; oderinstall -m 755 foo.sh ../bin/foo
. oderMakefile
Regel, um eine Syntaxprüfung durchzuführen, bevor die Quelldatei von$HOME/source
in 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 densource
eingebauten 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.sh
während Befehle ein gehen/usr/bin/name_of_command
(ohne Suffix).quelle
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 (
.rb
für Ruby-Module,.so
für gemeinsam genutzte ELF-Bibliotheken usw.).quelle