Sie können einen Symlink immer verwenden, da er /bin/shin den meisten Fällen unter Linux bereits ein Symlink zu ist bash. Es ist nur so, dass viele Skripte /bin/sh
hartcodiert sind
5
Nun, da Sie die Antwort haben, dass es leben kann, wo es will, können Sie sich fragen: Wie können Sie dann tragbar eine Shebang-Zeile für schreiben sh? Und die Antwort lautet: shebang ist auch nicht Teil von POSIX, sodass das Problem nicht einmal auftaucht.
Jörg W Mittag
1
@ JörgWMittag Ja, es ist manchmal überraschend, wie viele der Dinge, die wir als "Standard" -Unix-Funktionen betrachten, von POSIX nicht wirklich benötigt werden.
Barmar
1
Ob Sie einen Shebang verwenden oder nicht, ist unabhängig davon, ob der Pfad /bin/shauf einem POSIX-System vorhanden sein muss.
Chepner
Zumindest auf von Ubuntu abgeleiteten Systemen /bin/shbesteht ein Link zu dash. Auf den BSDs /bin/shist es kein Link, sondern eine separate ausführbare Datei, und schon gar nicht bash.
Rhialto unterstützt Monica am
Antworten:
22
POSIX Mandate nur die /devund /tmpVerzeichnisse zu existieren , und die /dev/null, /dev/ttyund /dev/consoleDateien. Die Standarddienstprogramme müssen vorhanden sein, es ist jedoch kein bestimmter Speicherort angegeben. Möglicherweise /bingibt es überhaupt kein a sh, und wenn ja, enthält es möglicherweise kein a , und wenn ja, handelt es sich möglicherweise nicht um ein POSIX sh.
Mit dem folgenden Befehl können Sie eine gültige PATHVariable abrufen, die die POSIX-Tools enthält, einschließlich :shgetconf
Zu Solaris: ... es sei denn, Sie führen eine Solaris-Installation mit "kleinem Server" aus, bei der viele der POSIX-Tools weggelassen werden. Siehe unix.stackexchange.com/q/360359/135943
Wildcard
"Nutzlose"? Ich würde sie lieber als überflüssig bezeichnen.
Mukesh Sai Kumar
2
Wie wird getconf gefunden?
Joshua
@MukeshSaiKumar Ein eigenständiger "CD" -Befehl kann niemals funktionieren
Stop Harming Monica
Nun, es "funktioniert" nur für einen Wert, der beispielsweise testet, ob Sie in ein Verzeichnis wechseln können , aber den Prozess, der es dort aufgerufen hat, nicht tatsächlich belässt. Das ist jedoch mehr Funktionalität als gar keine.
Charles Duffy
12
Nein, es ist nicht erforderlich, um dabei shzu sein /bin. Er zitiert ausdrücklich /bin, /usr/binund /usr/xpg4/binals mögliche Standorte. Die POSIX-Spezifikation erfordert nur, dass shder Pfad angegeben ist.
Anwendungen sollten beachten, dass der Standard-PATH für die Shell nicht entweder /bin/shoder sein /usr/bin/shkann und durch Abfrage des von getconf PATH zurückgegebenen PATH ermittelt werden sollte, wobei sicherzustellen ist, dass der zurückgegebene Pfadname ein absoluter Pfadname und kein in die Shell integrierter Pfadname ist.
So ermitteln Sie beispielsweise den Speicherort des Standarddienstprogramms sh:
command -v sh
Bei einigen Implementierungen kann dies Folgendes zurückgeben:
Wie bereits erwähnt, ist dies für die POSIX-Konformität nicht unbedingt erforderlich.
Die Kompatibilität mit vorhandener Software ist jedoch weitaus wichtiger (schließlich besteht der Zweck von POSIX darin, dass bestimmte Funktionen auf allen kompatiblen Betriebssystemen ausgeführt werden). Wenn ein Betriebssystem keine sh at-Funktion /bin/shbietet, kann dies einige Probleme verursachen.
Eine andere Möglichkeit, wie einige historische Implementierungen mit Shell-Skripten umgehen, besteht darin, die ersten beiden Bytes der Datei als Zeichenfolge "#!" und Verwenden des Restes der ersten Zeile der Datei als Name des auszuführenden Befehlsinterpreters.
Wenn dies jedoch nicht unterstützt wird, wird eine Vielzahl vorhandener Software beschädigt oder erfordert zusätzliche Arbeit zum Portieren.
/bin/sh
in den meisten Fällen unter Linux bereits ein Symlink zu istbash
. Es ist nur so, dass viele Skripte/bin/sh
sh
? Und die Antwort lautet: shebang ist auch nicht Teil von POSIX, sodass das Problem nicht einmal auftaucht./bin/sh
auf einem POSIX-System vorhanden sein muss./bin/sh
besteht ein Link zudash
. Auf den BSDs/bin/sh
ist es kein Link, sondern eine separate ausführbare Datei, und schon gar nichtbash
.Antworten:
POSIX Mandate nur die
/dev
und/tmp
Verzeichnisse zu existieren , und die/dev/null
,/dev/tty
und/dev/console
Dateien. Die Standarddienstprogramme müssen vorhanden sein, es ist jedoch kein bestimmter Speicherort angegeben. Möglicherweise/bin
gibt es überhaupt kein ash
, und wenn ja, enthält es möglicherweise kein a , und wenn ja, handelt es sich möglicherweise nicht um ein POSIXsh
.Mit dem folgenden Befehl können Sie eine gültige
PATH
Variable abrufen, die die POSIX-Tools enthält, einschließlich :sh
getconf
Dies kann beispielsweise unter Solaris nützlich sein, wo die Standardeinstellung
sh
nicht POSIX-kompatibel ist , aber eine kompatible Versionsh
bereitgestellt wird und auf diese Weise zugegriffen werden kann (da Solaris ein zertifiziertes Unix ist ).getconf PATH
wird/usr/xpg4/bin
an der Front enthalten, die POSIXsh
und eine Reihe von anderen erforderlichen Tools ( einschließlich nutzloser wiecd
) enthält.quelle
Nein, es ist nicht erforderlich, um dabei
sh
zu sein/bin
. Er zitiert ausdrücklich/bin
,/usr/bin
und/usr/xpg4/bin
als mögliche Standorte. Die POSIX-Spezifikation erfordert nur, dasssh
der Pfad angegeben ist.In der POSIX-Spezifikation heißt es:
quelle
Wie bereits erwähnt, ist dies für die POSIX-Konformität nicht unbedingt erforderlich.
Die Kompatibilität mit vorhandener Software ist jedoch weitaus wichtiger (schließlich besteht der Zweck von POSIX darin, dass bestimmte Funktionen auf allen kompatiblen Betriebssystemen ausgeführt werden). Wenn ein Betriebssystem keine sh at-Funktion
/bin/sh
bietet, kann dies einige Probleme verursachen.Am offensichtlichsten ist, dass Skripte,
#!/bin/sh
die auf diesen Pfad angewiesen sind, standardisiert sind. Dies ist nicht erforderlich, um zu arbeiten; POSIX erfordert nicht einmal die#!
Unterstützung von Zeilen, obwohl es erwähnt, dass solche Funktionen häufig sind :Wenn dies jedoch nicht unterstützt wird, wird eine Vielzahl vorhandener Software beschädigt oder erfordert zusätzliche Arbeit zum Portieren.
quelle