Ich sehe zwei Verwendungsmöglichkeiten für die SHELL
Umgebungsvariable:
- 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 -c
Parameter 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 SHELL
auf etwas Seltsames einstelle ?
make
darf SHELL
, ist das unkompliziert. Aber der Absatz, der mit "Wenn es nur verwendet würde" usw. beginnt, untergräbt die Frage.
SHELL
Besonderes ist (zumindest für gnu make). Es wird nicht auf diese Weise initialisiert.
$SHELL
ist die einzige Umgebungsvariable, die make
nicht importiert werden darf. Dies liegt daran, dass Benutzer möglicherweise eine solche Shell haben csh
, die nicht kompatibel ist.
system
enthä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. "
SHELL
obligatorisch 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).