Gibt es einen Bash
Shebang, der für die meisten Zwecke objektiv besser ist als die anderen?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- usw
Ich erinnere mich vage an eine lange Zeit, als ich hörte, dass das Hinzufügen eines Bindestrichs am Ende verhindert, dass jemand einen Befehl an Ihr Skript übergibt, aber keine Details dazu finden kann.
/usr/local/bin/bash
auf OpenBSD.Antworten:
Sie sollten
#!/usr/bin/env bash
für die Portabilität Folgendes verwenden : Verschiedene * Nixe, diebash
an verschiedenen Stellen platziert wurden, und die Verwendung/usr/bin/env
ist eine Problemumgehung, um die erstenbash
auf dem Programm gefundenen Nixe auszuführenPATH
. Undsh
ist nichtbash
.quelle
/bin/sh
usw.) ist.bash
lebt nicht/bin
auf allen Systemen.alias shebang='echo "#!/usr/bin/env bash"'
Jetzt muss ich nur noch das Terminal öffnen und shebang eingeben, anstatt hierher zu gehen.env
das bei ist/usr/bin/env
. Es könnte tatsächlich an/bin/env
oder irgendwo sein, solange es sich auf dem Weg befindet. Es könnte sein,/dummy/env
wenn in/dummy
istPATH
. Shebang selbst ist unter POSIX undefiniert, daher könnte ich#!stop toaster
die USB-Kaffeemaschine starten und POSIX-konform sein. Ist#!/usr/bin/env bash
also nicht besonders besser als#!/bin/bash
, es könnte je nach tragbarer sein./usr/bin/env
gibt es auf mehr Computern als auf/bin/bash
xor/usr/bin/bash
, sodass ein Skript, das mit dieser Zeile beginnt , auf so vielen Computern wie möglich die erwartete Leistung erbringt./bin/sh
ist in der Regel eine Verknüpfung zur Standard-Shell des Systems, die häufigbash
aber auf zB Debian-Systemen das geringere Gewicht aufweistdash
. In jedem Fall ist die ursprüngliche Bourne-Shell.sh
Wenn Ihr Skript also einigebash
(2. Generation, "Bourne Again sh") spezifische Funktionen ([[ ]]
Tests, Arrays, verschiedene zuckerhaltige Dinge usw.) verwendet, sollten Sie spezifischer sein und die späteren verwenden . Auf diese Weise wird Ihr Skript auf Systemen, auf denen bash nicht installiert ist, nicht ausgeführt. Ich verstehe, dass es vielleicht eine aufregende Trilogie von Filmen über diese Entwicklung gibt ... aber das könnte Hörensagen sein.Beachten Sie auch , dass , wenn evoziert wie
sh
,bash
in gewissem Maße verhält sich wie POSIX - Standardsh
(siehe auch die GNU - Dokumentation über diese).quelle
/bin/sh
zu einer beliebigen Stelle her,/usr
da dies die Ausführung der Init-Skripte vor dem Mounten erschweren würde/usr
./bin
und/sbin
seit Jahren standardmäßig nur Symlinks zu/usr/bin
und vorhanden/usr/sbin
sind. In diesem Zusammenhang/bin/sh
handelt es sich also um einen Link zubash
und den tatsächlichen Verzeichnis ist/usr/bin
. Aber ich werde das oben korrigieren.Ich empfehle:
Es ist nicht 100% portabel (einige Systeme befinden sich
bash
an einem anderen Ort als/bin
), aber die Tatsache, dass viele vorhandene Skripte#!/bin/bash
Druck auf verschiedene Betriebssysteme ausüben, um/bin/bash
zumindest eine Symlink-Verbindung zum Hauptstandort herzustellen .Die Alternative von:
wurde vorgeschlagen - aber es gibt keine Garantie dafür, dass der
env
Befehl vorhanden ist/usr/bin
(und ich habe Systeme verwendet, bei denen dies nicht der Fall ist). Darüber hinaus wird in diesem Formular die erste Instanz vonbash
in den aktuellen Benutzern verwendet$PATH
, die möglicherweise keine geeignete Version der Bash-Shell ist.(Sollte aber
/usr/bin/env
auf jedem einigermaßen modernen System funktionieren, entweder weilenv
es installiert ist/usr/bin
oder weil das System etwas tut, damit es funktioniert. Das System, auf das ich oben Bezug genommen habe, war SunOS 4, das ich wahrscheinlich seit etwa 25 Jahren nicht mehr verwendet habe.)Wenn Sie ein Skript benötigen, um auf einem System ausgeführt zu werden, das nicht vorhanden ist
/bin/bash
, können Sie das Skript so ändern , dass es auf den richtigen Speicherort verweist (was zugegebenermaßen unpraktisch ist).Ich habe die Kompromisse in meiner Antwort auf diese Frage ausführlicher erörtert .
Ein etwas obskures Update: Ein System, das ich verwende, Termux , eine Desktop-Linux-ähnliche Schicht, die unter Android ausgeführt wird, hat
/bin/bash
(bash
ist/data/data/com.termux/files/usr/bin/bash
) nicht - aber es muss speziell behandelt werden#!/bin/bash
.quelle
Die Verwendung einer Shebang-Zeile zum Aufrufen des entsprechenden Interpreters ist nicht nur für BASH gedacht. Sie können den Shebang für jede interpretierte Sprache auf Ihrem System verwenden, z. B. Perl, Python, PHP (CLI) und viele andere. Übrigens der Schebang
(Es können auch zwei Striche sein, dh
--
) Beendet Bash-Optionen. Alles, was danach folgt, wird als Dateiname und Argument behandelt.Wenn Sie den
env
Befehl verwenden, wird Ihr Skript portabel und Sie können benutzerdefinierte Umgebungen für Ihr Skript einrichten. Daher sollten tragbare Skripte verwendet werdenOder für welche Sprache auch immer wie für Perl
Schauen Sie sich unbedingt die
man
Seiten an fürbash
:und
env
:Hinweis: Auf Debian und Debian-basierten Systemen wie Ubuntu
sh
istdash
nicht verbundenbash
. Wie alle Systemskripte verwendensh
. Dies ermöglicht laut Debian, dass Bash wächst und das System stabil bleibt.Um den Aufruf * nix beizubehalten, verwende ich niemals Dateierweiterungen für von Shebang aufgerufene Skripte, da Sie die Erweiterung beim Aufruf für ausführbare Dateien nicht wie unter Windows weglassen können. Der Dateibefehl kann es als Skript identifizieren.
quelle
Es hängt wirklich davon ab, wie Sie Ihre Bash-Skripte schreiben. Wenn Ihr
/bin/sh
Symbol mit Bash verknüpft ist und Bash als aufgerufen wirdsh
, sind einige Funktionen nicht verfügbar .Wenn Sie bash-spezifische Nicht-POSIX-Funktionen wünschen, verwenden Sie
#!/bin/bash
quelle
pkg_add
sich in/usr/local/bin
, das möglicherweise nicht auf dem Pfad ist.POSIX
Funktion?