Ist die $ SHELL-Umgebungsvariable nur für interaktive Shells?

7

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 ?

Joachim Breitner
quelle
2
Die Frage scheint anzunehmen, dass die Einstellung 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).
Thomas Dickey
1
Die erste Hälfte der Frage ist das Problem. Wenn nur geklärt würde, warum verwendet werden makedarf SHELL, ist das unkompliziert. Aber der Absatz, der mit "Wenn es nur verwendet würde" usw. beginnt, untergräbt die Frage.
Thomas Dickey
2
@JoachimBreitner, beachten Sie, dass make-Variablen normalerweise aus Umgebungsvariablen initialisiert werden (Details finden Sie in einer Referenz), diesbezüglich jedoch etwas SHELLBesonderes ist (zumindest für gnu make). Es wird nicht auf diese Weise initialisiert.
AProgrammer
1
$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.
schily
1
Übrigens 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. "
AProgrammer

Antworten:

6

Keine der POSIX C-APIs verwendet die SHELLUmgebungsvariable explizit. Die Funktion systemund popenmuss ein aufgerufenes Programm aufrufen sh. Einige Dienstprogramme (zB ex, mailx, ...) verwenden müssen $SHELL, aber immer vom Benutzer bereitgestellte Code auszuführen; makeignoriert ausdrücklich $SHELL.

Im Abschnitt zu Umgebungsvariablen können Dienstprogramme , jedoch keine C-APIs („Systemschnittstellen“) ein anderes Verhalten aufweisen, wenn $SHELLsie nicht mit POSIX sh übereinstimmen.

In der Praxis SHELLwird 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, $SHELLanstatt shsh-Skripte auszuführen. Dies ist ziemlich selten und muss Sie nicht davon abhalten, sich auf das einzustellen SHELL, was Sie möchten.

Kurz gesagt, ja, SHELList Ihre bevorzugte interaktive Shell, und Anwendungen erhalten keine Garantie dafür, welche Syntax sie akzeptieren oder ob sie eine -cOption akzeptieren .

Gilles 'SO - hör auf böse zu sein'
quelle