Ich sehe zwei Verwendungsmöglichkeiten für die SHELLUmgebungsvariable:
- Es kann verwendet werden, um die interaktive Shell anzugeben, die der Benutzer verwenden möchte, und / oder
- Es kann von Prozessen verwendet werden, um andere Befehle auszuführen, wobei der Befehl in der üblichen Sprache ersetzt wird
/bin/sh -c "...".
Wenn es nur für das erstere verwendet würde, könnte es etwas sehr Seltsames sein (z. B. ipython), wenn es auch für das letztere verwendet werden soll, muss es eine Grundform der POSIX-Kompatibilität bereitstellen, z. B. den -cParameter verstehen und die Umgebung intakt halten (z. das ist überraschend schwierig ).
Der POSIX-Standard ist hier nicht sehr explizit, er schreibt nur.
Diese Variable muss einen Pfadnamen des bevorzugten Befehlssprachendolmetschers des Benutzers darstellen. Wenn dieser Interpreter nicht mit der Shell-Befehlssprache im Shell- und Dienstprogramm-Volume von IEEE Std 1003.1-2001, Kapitel 2, Shell-Befehlssprache, übereinstimmt, verhalten sich Dienstprogramme möglicherweise anders als in IEEE Std 1003.1-2001 beschrieben.
Ist die zweite Verwendung tatsächlich üblich und / oder gültig und daher etwas, worüber ich mir Sorgen machen muss, wenn ich mich SHELLauf etwas Seltsames einstelle ?
makedarf SHELL, ist das unkompliziert. Aber der Absatz, der mit "Wenn es nur verwendet würde" usw. beginnt, untergräbt die Frage.
SHELLBesonderes ist (zumindest für gnu make). Es wird nicht auf diese Weise initialisiert.
$SHELList die einzige Umgebungsvariable, die makenicht importiert werden darf. Dies liegt daran, dass Benutzer möglicherweise eine solche Shell haben csh, die nicht kompatibel ist.
systementhält die Begründung von "Ein Prüfer schlug vor, dass eine Implementierung von system () möglicherweise eine Umgebungsvariable wie SHELL verwenden möchte, um zu bestimmen, welcher Befehlsinterpreter verwendet werden soll. Die angenommene Implementierung würde den Standardbefehlsinterpreter verwenden, wenn der von der Umgebung angegebene Variable war nicht verfügbar. Dies würde es einem Benutzer ermöglichen, bei Verwendung einer Anwendung, die zur Verarbeitung von Befehlszeilen mit system () auffordert, einen anderen Befehlsinterpreter anzugeben. Von einer solchen Implementierung wird abgeraten. "
SHELLobligatorisch ist: nicht. POSIX gibt lediglich an, wie die Variable beim Setzen interpretiert wird. Was "richtig" betrifft, so macht dieser Aspekt die Frage meinungsbasiert (es werden nur Meinungen angezogen).