Ich habe an einer Reihe von Stellen gesehen, einschließlich Empfehlungen auf dieser Website ( Was ist der bevorzugte Bash Shebang? ), Um#!/usr/bin/env bash
bevorzugt zu verwenden #!/bin/bash
. Ich habe sogar ein unternehmender Einzel gesehen empfehlen die Verwendung #!/bin/bash
war falsch und bash Funktionalität würde , indem Sie so verloren.
Trotzdem verwende ich bash in einer streng kontrollierten Testumgebung, in der jedes im Umlauf befindliche Laufwerk im Wesentlichen ein Klon eines einzelnen Master-Laufwerks ist. Ich verstehe das Portabilitätsargument, obwohl es in meinem Fall nicht unbedingt anwendbar ist. Gibt es einen anderen Grund, #!/usr/bin/env bash
den Alternativen den Vorzug zu geben, und gibt es einen Grund, der die Funktionalität beeinträchtigen könnte, wenn die Portabilität ein Problem darstellt?
env
möglicherweise nicht bei/usr/bin
. Shebang Kommentare sind meiner Meinung nach insgesamt eine schlechte Idee. Wenn Ihr Standard-Skriptinterpreter keine Shebang-Kommentare verarbeitet, handelt es sich nur um einen Kommentar. Wenn Sie jedoch wissen, dass der Skriptinterpreter mit Shebang-Kommentaren umgehen kann, und Sie den Pfad zum Bash kennen, gibt es keinen Grund, ihn nicht über seinen absoluten Pfad aufzurufen, es sei denn, der Pfad ist zu lang (unwahrscheinlich), oder Sie portieren das Skript möglicherweise zu einem System, in dem sich keine Bash in / bin befindet. Andererseits gelten in diesem Fall die zuvor erwähnten Einschränkungen, da es sich um Portabilität handelt./etc
oder existieren/bin/sh
.bash
ist ein Add-On für die meisten Unix-ähnlichen Systeme. Es ist nur Linux, wobash
es garantiert ist/bin
und höchstwahrscheinlich auch als/bin/sh
. Seit Linux für viele Menschen das moderne De-facto-Unix wurde, wurde die Tatsache vergessen, dass andere Systeme als Linux existieren könnten. In meiner eigenen Antwort unten habe ich Linux angenommen, weil Sie gesagt habenbash
. Viele der BSD-Boxen, mit denen ich gearbeitet habe, hatten es nicht einmal installiert./bin/bash
. Bash ist nicht standardmäßig installiert. Wenn du es willst, musst dupkg install bash
. Einmal installiert, befindet es sich bei/usr/local/bin/bash
. Auf/bin/bash
OpenBSD ist nichts installiert . Ein Scheiß auf#!/bin/bash
Willensfehler und#!/usr/bin/env bash
Erfolg.Antworten:
#!/usr/bin/env
suchtPATH
nachbash
undbash
ist nicht immer in/bin
, insbesondere auf Nicht-Linux-Systemen. Auf meinem OpenBSD-System ist es beispielsweise in/usr/local/bin
, da es als optionales Paket installiert wurde.Wenn Sie absolut sicher
bash
sind/bin
, dass dies der Fall ist und es immer sein wird, kann es nicht schaden, es direkt in Ihren Shebang zu setzen - aber ich würde es ablehnen, da Skripte und Programme alle ein Leben haben, das über das hinausgeht, was wir ursprünglich angenommen haben.quelle
env
Lage? POSIX erzwingt es nicht./usr/lib/sendmail
(oder in jüngerer Zeit/usr/sbin/sendmail
) Binärdatei für die Verarbeitung von E-Mails verfügbar ist, liegt dies im Interesse eines Unix-ähnlichen Systems,/usr/bin/env
da der env shebang eine so gängige Praxis ist. Es ist eine De-facto-Standardschnittstelle.env
, aber irgendwie keinen Standardstandort (der nur ein Softlink sein kann) fürbash
. Ganz zu schweigen davon, warum dann Hashbang nicht einfach akzeptiert#!bash
und das verwendetPATH
, anstatt dass wir genau das Gleiche mit tunenv
. Nicht verwirrend genug für Anfänger, denke ich.This mostly works because the path /usr/bin/env is commonly used for the env utility
hier en.wikipedia.org/wiki/Shebang_(Unix) - Wir müssen uns darauf verlassenenv
, dass wir "wahrscheinlich" in allen Systemen da sind.env
befand/bin
, nicht in/usr/bin
(nicht sicher, welches, wahrscheinlich SunOS 4). Heutzutage wird es sehr wahrscheinlich/usr/bin/env
verfügbar sein, nur wegen der Popularität des#!/usr/bin/env
Hacks.Der Standardspeicherort für Bash ist
/bin
, und ich vermute, dass dies auf allen Systemen zutrifft. Was ist jedoch, wenn Ihnen diese Version von Bash nicht gefällt? Zum Beispiel möchte ich Bash 4.2 verwenden, aber der Bash auf meinem Mac ist bei 3.2.5.Ich könnte versuchen, bash neu zu installieren,
/bin
aber das könnte eine schlechte Idee sein. Wenn ich mein Betriebssystem aktualisiere, wird es überschrieben.Ich könnte jedoch bash in installieren
/usr/local/bin/bash
und meinen PATH wie folgt einrichten:Wenn ich jetzt spezifiziere
bash
, bekomme ich nicht den alten/bin/bash
, sondern den neueren, glänzenderen/usr/local/bin
. Nett!Außer meine Shell-Skripte haben diesen
!# /bin/bash
Schebang. Wenn ich also meine Shell-Skripte ausführe, erhalte ich diese alte und miese Version von Bash, die nicht einmal assoziative Arrays enthält.Mit
/usr/bin/env bash
wird die in meinem PATH gefundene Bash-Version verwendet. Wenn ich meinen PATH so einrichte, dass er/usr/local/bin/bash
ausgeführt wird, ist dies die Bash, die meine Skripte verwenden.Es ist selten, dies bei Bash zu sehen, aber es ist viel häufiger bei Perl und Python:
/bin
?/usr/bin
?/opt/bin
? Wer weiß? Verwenden#! /usr/bin/env perl
bedeutete, dass ich es nicht wissen musste.Und jetzt, warum Sie nicht verwenden sollten
#! /usr/bin/env bash
Wenn der Pfad im Shebang fest codiert ist, muss ich mit diesem Dolmetscher laufen. Daher
#! /bin/bash
zwinge ich mich, die standardmäßig installierte Version von bash zu verwenden. Da die Bash-Funktionen sehr stabil sind (versuchen Sie, eine 2.x-Version eines Python-Skripts unter Python 3.x auszuführen), ist es sehr unwahrscheinlich, dass mein spezielles BASH-Skript nicht funktioniert, und da mein Bash-Skript wahrscheinlich von diesem System und anderen Systemen verwendet wird Die Verwendung einer nicht standardmäßigen Version von Bash kann unerwünschte Auswirkungen haben. Es ist sehr wahrscheinlich, dass ich sicherstellen möchte, dass die stabile Standardversion von bash mit meinem Shell-Skript verwendet wird. Daher möchte ich wahrscheinlich den Pfad in meinem Shebang hart codieren.quelle
Zum Aufrufen ist
bash
es ein bisschen übertrieben. Es sei denn, Sie haben mehrerebash
Binärdateien wie Ihre eigene in ~ / bin, aber das bedeutet auch, dass Ihr Code davon abhängt, dass $ PATH die richtigen Dinge enthält.Es ist praktisch für Dinge wie
python
. Es gibt Wrapper-Skripte und -Umgebungen, die dazu führen, dass alternativepython
Binärdateien verwendet werden.Wenn Sie jedoch den genauen Pfad zur Binärdatei verwenden, geht nichts verloren, solange Sie sicher sind, dass es sich um die Binärdatei handelt, die Sie wirklich möchten.
quelle
python
. Ich habe die Anzahl der Plätze verloren,python
die gefunden werden können 😀/usr/bin/env
dies für Python nützlicher ist, insbesondere wenn Sie virtualenv verwenden.Es gibt viele Systeme ohne Bash
/bin
, FreeBSD und OpenBSD, um nur einige zu nennen. Wenn Ihr Skript auf viele verschiedene Unices portierbar sein soll, möchten Sie es möglicherweise#!/usr/bin/env bash
anstelle von verwenden#!/bin/bash
.Beachten Sie, dass dies nicht gilt für
sh
; für Bourne-kompatible Skripte ausschließlich verwende ich#!/bin/sh
, da ich in Existenz so ziemlich jedes Unix denken hatsh
in/bin
.quelle
/bin
dir sehe ichsh -> dash
. Symbolisch verbunden mitdash
Ubuntus Debian-Natur. Führen Sie diese drei Befehlszeichenfolgen aus, um zu erkennen, dass alles auf die individuellen Vorlieben hinausläuft:which bash
dannwhich sh
dannwhich dash
.Ich würde es vorziehen, das Hauptprogramm in ein Skript wie das folgende zu packen, um alle
bash
auf dem System verfügbaren zu überprüfen . Besser mehr Kontrolle über die verwendete Version.quelle
ist definitiv besser, weil es den ausführbaren Pfad von bash aus Ihrer Systemumgebungsvariablen findet.
Gehen Sie zu Ihrer Linux-Shell und geben Sie ein
Es werden alle Ihre Umgebungsvariablen gedruckt.
Gehen Sie zu Ihrem Shell-Skript und geben Sie ein
Es wird Ihr Bash-Pfad (gemäß der Liste der Umgebungsvariablen) gedruckt, den Sie verwenden sollten, um Ihren korrekten Shebang-Pfad in Ihrem Skript zu erstellen.
quelle