Verwenden Sie die Erweiterung .sh oder .bash für Bash-Skripte?

36

(Siehe Verwenden von #! / Bin / sh oder #! / Bin / bash für Ubuntu-OSX-Kompatibilität, Benutzerfreundlichkeit und POSIX. )

Wenn ich möchte, dass meine Skripte die Bash-Shell verwenden, ruft die Erweiterung .bash tatsächlich Bash auf oder hängt sie von der Systemkonfiguration / 1st-Shebang-Zeile ab. Wenn beide wirksam wären, aber unterschiedlich, welche hätten dann Vorrang?

Ich bin mir nicht sicher, ob ich meine Skripte mit .sh beenden soll, um nur "Shell-Skript" anzugeben, und dann in der ersten Zeile die Bash-Shell auswählen soll (z. B. #!/usr/bin/env bash) oder ob ich sie nur mit .bash beenden soll (sowie mit der Einstellung für Zeile 1) ). Ich möchte, dass bash aufgerufen wird.

Michael Durrant
quelle
3
Ich glaube nicht, dass ich jemals eine .bashErweiterung gesehen habe. Es ist auch Debian-Richtlinie, Skripte in Paketen zu haben, die in einem der binOrdner landen und keine Erweiterungen haben.
Muru

Antworten:

19

Ruft die .bash-Erweiterung tatsächlich bash auf oder hängt sie von der Systemkonfiguration / 1st-Shebang-Zeile ab?

Wenn Sie keinen expliziten Interpreter verwenden, wird der aufgerufene Interpreter von dem shebangim Skript verwendeten bestimmt. Wenn Sie speziell einen Interpreter verwenden, ist es dem Interpreter egal, welche Erweiterung Sie für Ihr Skript angeben. Die Erweiterung ist jedoch vorhanden, um anderen klar zu machen, um welche Art von Skript es sich handelt.

[sreeraj@server ~]$ cat ./ext.py
#!/bin/bash
echo "Hi. I am a bash script"

Siehe, die .pyErweiterung des Bash-Skripts macht es nicht zu einem Python-Skript.

[sreeraj@server ~]$ python ./ext.py
  File "./ext.py", line 2
    echo "Hi. I am a bash script"
                                ^
SyntaxError: invalid syntax

Es ist immer ein bashSkript.

[sreeraj@server ~]$ ./ext.py
Hi. I am a bash script
Sree
quelle
23

Die Benennung des Skripts hat nichts damit zu tun, wie es ausgeführt wird.

Die shebang-Zeile definiert, mit welchem ​​Interpreter das Skript ausgeführt wird.

Es ist mir persönlich egal, ob ein Skript sh, bash, perl ist oder nicht. Ich finde das Hinzufügen einer Erweiterung überflüssig. Ich werde tun file scriptname, um herauszufinden, was die Datei ist, wenn ich das wissen will.

Wenn Sie also möchten, dass Ihr Skript ausgeführt wird bash, verwenden Sie #!/bin/bashals erste Zeile.

wurtel
quelle
4
Auch wenn sich die Wahl der Implementierung für das Skript ändert (sagen wir, es wurde in Python, Perl, C ... umgeschrieben), .shbedeutet das Fehlen einer -style-Erweiterung, dass es nicht erforderlich ist, es umzubenennen. (Zugegeben, nichts hindert ein C-Programm daran, eine Binärdatei mit einer .shErweiterung zu erstellen. Es wäre nur verwirrend.)
Stephen Kitt
2
Gebrauch #!/usr/bin/env bashfür Portabilität, hier besprochen stackoverflow.com/a/10383546/54964
Léo Léopold Hertz 준영
4
@wurtel (verspäteter Kommentar, OK?) Das Hinzufügen einer Erweiterung imho ist alles andere als überflüssig. Die meisten Editoren unterstützen Syntaxhervorhebungen basierend auf der Erweiterung. Außerdem ist es sinnvoll, den Dateityp sofort sichtbar zu machen. Klarheit und Lesbarkeit sind sehr wichtig.
RolfBly
@RolfBly: Die von mir verwendeten Editoren erkennen den Shebang und sorgen für Syntax-Hervorhebung. Klarheit ist nützlich, aber die meiste Zeit möchten wir einen Befehl ausführen und es ist gut, wenn ich weniger tippen muss und mich nicht an seine Implementierungssprache erinnern muss.
Hontvári Levente