SHELL="/bin/bash" vs SHELL="bash"

SHELL="/bin/bash" vs SHELL="bash"

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/bashoder bashin 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 SHELLauf der Client- oder der Serverseite manipuliert wird. Es gibt keinemcvein der Frage. Es ist auch nicht klar, warum Sie es einsetzen müssen SHELL. .bashrcIch werde nichts davon untersuchen.

Ich werde Ihnen SHELLden Unterschied zwischen /bin/bashund erklären.bash Im Algemeinen.

Der Zweck der SHELLUmgebungsvariable 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 diePATHUmgebungsvariable, manche nicht.

Die Abhängigkeit von PATHfunktioniert wie folgt. Es gibt eine Zeichenfolge, die „kodiert“, welche ausführbare Datei ausgeführt werden soll. Die Zeichenfolge kann beispielsweise /bin/bash, foo/bashoder sein bash. Es gibt zwei Fälle:

  1. 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.
  2. 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 aus PATH. Im Grunde ist es das erste in angegebene Verzeichnis, PATHdas eine ausführbare Datei mit dem angegebenen Basisnamen enthält. Abhängig von PATHkann es als , , ( bashaufgelöst werden./bin/bash/home/you/bin/bash./bashselten) oder gar nicht (mit der Fehlermeldung „ command not foundoder einem ähnlichen Fehler“).

Shells sind auf angewiesen PATH, daher findet in einer Shell bash(wörtlich eingegeben oder aus der Erweiterung von $SHELLoder was auch immer hervorgehend) /bin/bashoder /some/other/path/to/bashin einem vernünftig konfigurierten System.

Tools, die nicht auf angewiesen sind, PATHbehandeln 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 bashund direkt als Pfad interpretiert wird, ist das gleichbedeutend mit ./bashwas „Datei mit dem Namen bashim aktuellen Arbeitsverzeichnis“ bedeutet.

Was auch immer den Fehler verursacht hat, hat anscheinend den Inhalt der SHELLVariable abgerufen und ihn als Pfad verwendet, ohne sich auf die PATHVariable zu verlassen.

Das war das Richtige. Hinweis POSIXgibt anSHELLals:

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 SHELLVariable verwendet, muss ihren Inhalt direkt als Pfadnamen behandeln.

Wenn SHELL="bash"in einer Shell "$SHELL"läuft Bash nur, weil $SHELLerweitertwie jede andere Variableund bashwird 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 PATHverwendet werden kann, nicht mit der SHELLInterpretation kollidiert.

Höchstwahrscheinlich möchten Sie das nicht ./bash. Sie möchten /bin/bashalso genau dies verwenden.

verwandte Informationen