Shell-Variable vs. Umgebungsvariable, welche wird bevorzugt, wenn beide den gleichen Namen haben?

10

Geben Sie Folgendes in Bash ein:

env | grep USER

und

set | grep USER

gibt beide Male den gleichen Benutzernamen.

Woher weiß ich beispielsweise bei der Eingabe, echo $USERob die Shell oder die Umgebungsvariable angezeigt wurde?

Hai
quelle

Antworten:

14

Für POSIX-kompatible Shells (einschließlich Bash) heißt es im Standard:

2.5.3 Shell-Variablen
Variablen müssen aus der Umgebung initialisiert werden [...] Wenn eine Variable aus der Umgebung initialisiert wird, muss sie sofort für den Export markiert werden. Siehe das eingebaute Export-Special. Neue Variablen können mit Variablenzuweisungen definiert und initialisiert werden, [usw.]

Und über export:

export name[=word]...
Die Shell gibt den Variablen, die den angegebenen Namen entsprechen, das Exportattribut, wodurch sie sich in der Umgebung von anschließend ausgeführten Befehlen befinden.

Aus Sicht der Shell gibt es also nur Variablen. Einige von ihnen stammen möglicherweise aus der Umgebung, als die Shell gestartet wurde, und einige von ihnen wurden möglicherweise in die Umgebung der Prozesse exportiert, die die Shell startet.

(Die "Umgebung" ist wirklich nur eine Reihe von Zeichenfolgen, die beim Starten an den Prozess übergeben werden. Wenn der Prozess ausgeführt wird, kann er damit tun, was er will, ihn verwenden, ignorieren, überschreiben. Und was ein Prozess weitergibt Das Starten anderer Prozesse kann noch eine andere Sache sein, obwohl es natürlich üblich ist, alle Umgebungsvariablen einfach erneut weiterzugeben.)


Wenn Sie eine Nicht-POSIX-Shell verwenden, z. B. cshandere Dinge:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
ilkkachu
quelle
1
Beachten Sie, dass die Bourne-Shell wie csh Shell-Variablen aus Umgebungsvariablen initialisiert. Das Ändern von Shell-Variablen wirkt sich jedoch nicht auf die entsprechende Umgebungsvariable aus, es sei denn, Sie exportieren sie. Das ist etwas, das von der Korn-Shell gebrochen wurde (und von POSIX spezifiziert wurde). Aus diesem Grund sollten Sie mit dem Namen der Shell-Variablen, die Sie jetzt verwenden, vorsichtig sein, um sicherzustellen, dass Sie keine env-Variablen ändern, die sich auf Befehle auswirken könnten, die Sie in Ihrem Skript ausführen.
Stéphane Chazelas
4

Dies sind ein und dieselbe Variable. In der Shell haben Umgebungsvariablen und Shell-Variablen im Gegensatz zu den meisten anderen Programmiersprachen denselben Namensraum. In der Shell ist eine Umgebungsvariable eine Shell-Variable, mit der exportiert wurde export.

Siehe zum Beispiel meine Antwort auf Ihre vorherige Frage " Was ist der Unterschied in der Verwendung zwischen Shell-Variablen und Umgebungsvariablen? "

Kusalananda
quelle
Ich werde Ihre Erklärung noch einmal lesen, nur muss ich erst einige Dinge lernen, bevor ich Ihre Antwort verstehen kann.
Hai
@sharkant Keine Sorge. Wenn ich Dinge verwirre, dann sag es mir einfach und ich werde versuchen zu klären. ilkkachus Antwort ist auch gut.
Kusalananda
nein, ich glaube nicht, du hast einen guten Erklärungsstil, nur mein Mangel an Wissen kann sie noch nicht schätzen.
Hai
2

Die Shell-Variable kann nur für die aktuelle Shell verwendet werden. Sie kann nicht systemweit verwendet werden. Am anderen Ende kann die Umgebungsvariable systemweit verwendet werden. Konventionell werden Shell-Variablen als Kleinbuchstaben geschrieben, während Umgebungsvariablen als Großbuchstaben geschrieben werden. Sie können eine Shell-Variable als Umgebungsvariable verwenden, Sie müssen sie nur exportieren.

Nazmul Ahmed Noyon
quelle