Frage an bash, shebang – Was ist der bevorzugte Bash Shebang?

904

Gibt es irgendwelcheBash objektiv besser als die anderen für die meisten Verwendungen?

#!/usr/bin/env bash#!/bin/bash#!/bin/sh#!/bin/sh -usw

Ich erinnere mich vage an eine lange Zeit, in der ich gehört habe, dass das Hinzufügen eines Bindestrichs am Ende verhindert, dass jemand einen Befehl an Ihr Skript weitergibt, aber keine Details dazu finden kann.

Und sein/usr/local/bin/bash auf OpenBSD. jww

Deine Antwort

5   die antwort
17

erpreters ist nicht nur für BASH vorgesehen. Sie können den shebang für jede interpretierte Sprache auf Ihrem System wie Perl, Python, PHP (CLI) und viele andere verwenden. Übrigens, der Shebang

<code>#!/bin/sh -
</code>

(es können auch zwei Striche sein, d.h.--) Beendet die Bash-Optionen, wird alles, was danach folgt, als Dateiname und Argument behandelt.

Verwendung derenv Mit diesem Befehl können Sie Ihr Skript portabel machen und benutzerdefinierte Umgebungen für Ihr Skript einrichten. Daher sollten tragbare Skripts verwendet werden

<code>#!/usr/bin/env bash
</code>

Oder für was auch immer die Sprache wie für Perl

<code>#!/usr/bin/env perl
</code>

Achten Sie darauf, die zu betrachtenman Seiten fürbash:

<code>man bash
</code>

undenv:

<code>man env
</code>

Hinweis: Auf Debian- und Debian-basierten Systemen wie Ubuntush ist verbunden mitdash nichtbash. Wie alle Systemskripte verwendensh. Dies ermöglicht es, dass bash wächst und das System laut Debian stabil bleibt.

Außerdem, um Invocation * nix beizubehalten, als würde ich niemals Dateierweiterungen für von shebang aufgerufene Skripte verwenden, da Sie die Erweiterung beim Aufruf von ausführbaren Dateien nicht weglassen können, wie Sie es unter Windows können. Der Befehl file kann es als Skript identifizieren.

1231

#!/usr/bin/env bash zumPortabilität: verschiedene * nixe setzenbash an verschiedenen Orten und mit/usr/bin/env ist eine Problemumgehung, um die erste auszuführenbash gefunden auf derPATH. Undsh ist nichtbash.

Funktioniert dies unter Windows (Git Bash, Cygwin)? z0r
@ I0b0 Es wird die erwartete Sache tunwenn ich die richtige version in meinem pfad habe. Ich kann nicht angeben, dass mein Skript benötigtbash 4.2 oder später mit einem Shebang; Ich kann diese Anforderung nur dokumentieren. Wirklich, der Drehbuchautor sollte nicht derjenige sein, der die Kontrolle über den Schebang hat. Es sollte die Person seinLaufen das Drehbuch. Python macht das gut, IMO: Skripte verwenden#!pythonund das Installationsprogramm ersetzt es durch den richtigen Shebang für das Zielsystem. chepner
^^ Windows Git Bash Pfad ist/ user / bin / bash, aber mein Siteground-Hosting-Pfad ist/ bin / bash (überprüft mitecho $SHELL). Leo
Das Gleiche für mich, ich habe es gerade zu einem Alias ​​hinzugefügt:alias shebang='echo "#!/usr/bin/env bash"'Jetzt muss ich nur noch das Terminal öffnen und shebang eingeben, anstatt hierher zu gehen. Oylex
7

Ich empfehle die Verwendung von:

<code>#!/bin/bash
</code>

Es ist nicht 100% portabel (einige Systeme stellenbash an einem anderen Ort als/bin), aber die Tatsache, dass viele vorhandene Skripte verwenden#!/bin/bash Drücke verschiedene Betriebssysteme zu machen/bin/bash Zumindest ein Symlink zum Hauptstandort.

Die Alternative von:

<code>#!/usr/bin/env bash
</code>

wurde vorgeschlagen - aber es gibt keine Garantie dafür, dass dieenv Befehl ist in/usr/bin (und ich habe Systeme verwendet, wo es nicht ist). Darüber hinaus wird in diesem Formular die erste Instanz von verwendetbash in den aktuellen Benutzern$PATH, die möglicherweise keine geeignete Version der Bash-Shell ist.

Wenn Sie ein Skript benötigen, um auf einem System zu laufen, das kein Skript hat/bin/bashkönnen Sie das Skript so ändern, dass es auf den richtigen Speicherort verweist (was zugegebenermaßen unpraktisch ist).

Ich habe die Kompromisse in ausführlicher besprochenmeine Antwort zudiese Frage.

3

wie Sie Ihre Bash-Skripte schreiben. Wenn dein/bin/sh wird symbolisch mit bash verknüpft, wenn bash als aufgerufen wirdsh, Einige Funktionen sind nicht verfügbar.

Wenn Sie bashspezifische, nicht POSIX-bezogene Funktionen wünschen, verwenden Sie#!/bin/bash

Bash ist nicht auf OpenBSD installiert. Wenn Sie es über installierenpkg_add, dann liegt es in/usr/local/bin, die möglicherweise nicht auf dem Weg sind. jww
68

/bin/sh ist normalerweise eine Verknüpfung zur Standard-Shell des Systems, was häufig der Fall istbash B. auf Debian-Systemen ist das geringere Gewichtdash. In jedem Fall ist die ursprüngliche Bourne-ShellshAlso, wenn Ihr Skript einige verwendetbash (2. Generation, "Bourne Again sh") Besonderheiten ([[ ]] Tests, Arrays, verschiedene zuckerhaltige Dinge usw.), dann sollten Sie genauer sein und die später verwenden. Auf diese Weise wird Ihr Skript auf Systemen, auf denen bash nicht installiert ist, nicht ausgeführt. Ich verstehe, dass es vielleicht eine spannende Trilogie von Filmen über diese Entwicklung gibt ... aber das könnte Hörensagen sein.

Beachten Sie auch, dass bei Aufruf alssh, bash zu einem gewissen Gradverhält sich wie POSIX-Standard sh (siehe auchdie GNU-Dokumente darüber).

"Ich kann eine halbe Meile flach tippen, bevor meine Hände anfangen zu zittern." xdhmoore
Die meisten Systeme werdennicht Verknüpfung/bin/sh zu irgendwo in/usr da dies die Ausführung der Init-Skripte erschweren würde/usr montiert. aij
@aij Ich weiß nicht, warum ich "viele oder die meisten" dort abgelegt habe - ich bin ein Fedora-Benutzer, wo/bin und/sbin seit jahren gibt es nur symbolische links per default, zu/usr/bin und/usr/sbinAlso in diesem Zusammenhang/bin/sh ist ein Link zubash und das aktuelle Verzeichnis ist/usr/bin. Aber ich werde das oben korrigieren. delicateLatticeworkFever
Die Public Domain Korn Shell (pdksh) ist unter OpenBSD Standard. jww

Verwandte Fragen