Muss sich "sh" im Verzeichnis "/ bin" befinden?


16

Ich habe gelesen, dass POSIX-kompatible Betriebssysteme (zum Beispiel Linux) die shShell haben müssen .

Aber muss es shsich in dem /binVerzeichnis befinden oder kann es sich in einem beliebigen Verzeichnis befinden?


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

$ PATH=$(getconf PATH)
$ sh

Dies kann beispielsweise unter Solaris nützlich sein, wo die Standardeinstellung shnicht POSIX-kompatibel ist , aber eine kompatible Version shbereitgestellt wird und auf diese Weise zugegriffen werden kann (da Solaris ein zertifiziertes Unix ist ). getconf PATHwird /usr/xpg4/binan der Front enthalten, die POSIX shund eine Reihe von anderen erforderlichen Tools ( einschließlich nutzloser wiecd ) enthält.


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.

In der POSIX-Spezifikation heißt es:

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:

/usr/xpg4/bin/sh


2

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.

Am offensichtlichsten ist, dass Skripte, #!/bin/shdie 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 :

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.