![SHELL="/bin/bash" vs SHELL="bash"](https://rvso.com/image/1648608/SHELL%3D%22%2Fbin%2Fbash%22%20vs%20SHELL%3D%22bash%22.png)
Was ist der Unterschied zwischen dem Exportieren von SHELL="/bin/bash" und SHELL="bash"? Ich hatte es vorher export SHELL="bash"
in meiner .bashrc. Es schien zu funktionieren. $($SHELL) hat eine Subshell erzeugt, aber SSH mit Authentifizierung über öffentlichen Schlüssel hat den Fehler ausgegeben:Shell "bash" is not executable: No such file or directory
Antwort1
$($SHELL)
hat eine Unterschale hervorgebracht
Ja, denn in einer Schale $SHELL
(oderbesser "$SHELL"
) erweitert sich zu /bin/bash
oder bash
in Ihrem Fall zu einem „Both Spawn Bash“.
Randbemerkung: Wenn Sie verwenden $($SHELL)
, wird die Ausgabe der neuen Shell nach dem Beenden der Shell ausgeführt, da die Befehlssubstitution () so $( … )
funktioniert. Befehlssubstitutionmacht wenig Sinnhier und es ist nicht nötig, um Ihren Standpunkt zu verdeutlichen.
Ihr Punkt scheint zu sein: Wenn Bash ausgeführt wird SHELL="bash"
, "$SHELL"
beschwert sich dennoch ein anderes Tool (SSH-Server?).
Es ist nicht klar, welches Tool sich beschwert. Und Sie haben uns nicht gesagt, ob SHELL
auf der Client- oder der Serverseite manipuliert wird. Es gibt keinemcvein der Frage. Es ist auch nicht klar, warum Sie es einsetzen müssen SHELL
. .bashrc
Ich werde nichts davon untersuchen.
Ich werde Ihnen SHELL
den Unterschied zwischen /bin/bash
und erklären.bash
Im Algemeinen.
Der Zweck der SHELL
Umgebungsvariable besteht darin, auf die Shell zu verweisen, die Sie verwenden möchten. Verschiedene Programme können die Variable (falls gesetzt) verwenden, um aus irgendeinem Grund zu versuchen, die von Ihnen gewählte Shell auszuführen. Der von Ihnen beobachtete Unterschied tritt auf, weil einige Programme auf diePATH
Umgebungsvariable, manche nicht.
Die Abhängigkeit von PATH
funktioniert wie folgt. Es gibt eine Zeichenfolge, die „kodiert“, welche ausführbare Datei ausgeführt werden soll. Die Zeichenfolge kann beispielsweise /bin/bash
, foo/bash
oder sein bash
. Es gibt zwei Fälle:
- Wenn die Zeichenfolge enthält
/
, wird die Zeichenfolge selbst als absoluter Pfad (z. B./bin/bash
) oder relativer Pfad (z. B.foo/bash
) zur ausführbaren Datei interpretiert. - Wenn die Zeichenfolge keins enthält
/
(z. B.bash
), gibt sie nur den Basisnamen der ausführbaren Datei an. Der Rest des Pfads (d. h. Verzeichniskomponente(n)) stammt ausPATH
. Im Grunde ist es das erste in angegebene Verzeichnis,PATH
das eine ausführbare Datei mit dem angegebenen Basisnamen enthält. Abhängig vonPATH
kann es als , , (bash
aufgelöst werden./bin/bash
/home/you/bin/bash
./bash
selten) oder gar nicht (mit der Fehlermeldung „command not found
oder einem ähnlichen Fehler“).
Shells sind auf angewiesen PATH
, daher findet in einer Shell bash
(wörtlich eingegeben oder aus der Erweiterung von $SHELL
oder was auch immer hervorgehend) /bin/bash
oder /some/other/path/to/bash
in einem vernünftig konfigurierten System.
Tools, die nicht auf angewiesen sind, PATH
behandeln den String als Pfad (Pfadname). Für einen String, der enthält, macht das keinen Unterschied /
. Für einen String, der nicht enthält, macht es einen großen Unterschied /
. Wenn der String ist bash
und direkt als Pfad interpretiert wird, ist das gleichbedeutend mit ./bash
was „Datei mit dem Namen bash
im aktuellen Arbeitsverzeichnis“ bedeutet.
Was auch immer den Fehler verursacht hat, hat anscheinend den Inhalt der SHELL
Variable abgerufen und ihn als Pfad verwendet, ohne sich auf die PATH
Variable zu verlassen.
Das war das Richtige. Hinweis POSIXgibt anSHELL
als:
Diese Variable soll einen Pfadnamen des bevorzugten Befehlsspracheninterpreters des Benutzers darstellen.
Untersuchen "Pfadname" Und "Pfadnamenauflösung", diese sind nicht auf angewiesen PATH
. Jedes Tool, das die SHELL
Variable verwendet, muss ihren Inhalt direkt als Pfadnamen behandeln.
Wenn SHELL="bash"
in einer Shell "$SHELL"
läuft Bash nur, weil $SHELL
erweitertwie jede andere Variableund bash
wird dann behandeltwie jeder andere Befehl, der nicht enthält/
. Es ist also eher nebensächlich.
Wenn ich die POSIX-Dokumentation richtig interpretiere, sollten Sie SHELL="bash"
nur verwenden, wenn Sie meinen SHELL="./bash"
. Auch wenn Sie dies meinen, ist es besser, einen Pfad mit zu verwenden /
, damit die Mechanik in einer Shell, in der PATH
verwendet werden kann, nicht mit der SHELL
Interpretation kollidiert.
Höchstwahrscheinlich möchten Sie das nicht ./bash
. Sie möchten /bin/bash
also genau dies verwenden.