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 ?
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).make
darfSHELL
, 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, diemake
nicht importiert werden darf. Dies liegt daran, dass Benutzer möglicherweise eine solche Shell habencsh
, 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. "Antworten:
Keine der POSIX C-APIs verwendet die
SHELL
Umgebungsvariable explizit. Die Funktionsystem
undpopen
muss ein aufgerufenes Programm aufrufensh
. Einige Dienstprogramme (zBex
,mailx
, ...) verwenden müssen$SHELL
, aber immer vom Benutzer bereitgestellte Code auszuführen;make
ignoriert ausdrücklich$SHELL
.Im Abschnitt zu Umgebungsvariablen können Dienstprogramme , jedoch keine C-APIs („Systemschnittstellen“) ein anderes Verhalten aufweisen, wenn
$SHELL
sie nicht mit POSIX sh übereinstimmen.In der Praxis
SHELL
wird die Anmeldeshell des Benutzers festgelegt, die möglicherweise POSIX-kompatibel ist oder nicht. Zsh und Fisch sind beliebte Alternativen. Ich verwende zsh seit einem Jahrzehnt für verschiedene Unix-Varianten und kann mich nicht erinnern, dass ein Systemdienstprogramm ausgefallen ist. Ich habe gelegentlich schlampig geschriebene Code-Aufrufe gesehen,$SHELL
anstattsh
sh-Skripte auszuführen. Dies ist ziemlich selten und muss Sie nicht davon abhalten, sich auf das einzustellenSHELL
, was Sie möchten.Kurz gesagt, ja,
SHELL
ist Ihre bevorzugte interaktive Shell, und Anwendungen erhalten keine Garantie dafür, welche Syntax sie akzeptieren oder ob sie eine-c
Option akzeptieren .quelle