Festlegen von Linux-Umgebungsvariablen

9

Ich verwende Red Hat Linux Enterprise 5. Ich verwende immer den Befehl export, um Umgebungsvariablen festzulegen.

Gibt es andere Möglichkeiten, Umgebungsvariablen festzulegen, und welche Vor- und Nachteile haben sie?

George2
quelle

Antworten:

16

Dies ist ein Auszug aus der Bash-Manpage:

export [-fn] [name [= word]] ...
export -p
Die angegebenen Namen sind für den automatischen Export nachfolgend ausgeführter Befehle in die Umgebung markiert. Wenn die Option -f angegeben ist, beziehen sich die Namen auf Funktionen ...

Wenn Sie die Variable nur in der aktuellen Umgebung benötigen, ist der Export nicht erforderlich.

var=value

Bearbeiten:

Ohne Export: nur aktuelle Umgebung. Mit Export: aktuelle Umgebung und untergeordnete Umgebungen.

Hier ist eine Demonstration der Auswirkung des Exports auf die Verfügbarkeit einer Variablen in einer untergeordneten Umgebung und dass Änderungen in der untergeordneten Umgebung keine Auswirkungen auf die übergeordnete Umgebung haben:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

Nach dem ersten echo ( echo "parent...") sehen Sie "123" und "456", da beide var1und var2in der aktuellen Umgebung aktiv sind. Sie sehen keinen Wert für, var3da er noch nicht festgelegt ist.

Nach der Zeile, die " var3=..." beginnt , wird kein Wert für var1angezeigt, da er nicht exportiert wurde. Sie tun einen Wert für sehen , var2weil es wurde exportiert. Sie sehen einen Wert für , var3weil es für das Kind Umgebung wurde nur .

( bash -cEntspricht dem Ausführen eines Skripts mit dem Inhalt des Arguments für die -cOption. Ein Skript oder eine andere ausführbare Datei oder in diesem Fall das Argument, um bash -cein untergeordnetes Element der aktuellen Umgebung zu werden, die daher natürlich das untergeordnete Element ist Elternteil.)

Im "Skript" werden die Werte der Variablen geändert. Es gibt jetzt diese neuen Werte aus.

Sobald das "Skript" fertig ist, kehrt die Ausführung zur übergeordneten Umgebung zurück (in diesem Fall zur Befehlszeile). Nach dem letzten Echo werden die ursprünglichen Werte angezeigt, da die in der untergeordneten Umgebung vorgenommenen Änderungen keine Auswirkungen auf das übergeordnete Element haben.

Bis auf weiteres angehalten.
quelle
Was bedeutet "in der aktuellen Umgebung"? Aktuelles Bash-Skript oder?
George2
1
Ja, es bedeutet "im aktuellen Skript" oder "in der aktuellen interaktiven Sitzung". Das schließt also ausführbare Dateien oder Skripte aus, die im aktuellen Skript oder in der interaktiven Sitzung ausgeführt werden. exportDies ist der Zweck von - Variablen für diese untergeordneten Umgebungen verfügbar zu machen.
Bis auf weiteres angehalten.
Ich finde einige Konflikte aus dem, was Sie gesagt haben. :-) Sie sagten "Damit ausführbare Dateien oder Skripte ausgeschlossen werden", achten Sie auf "ausschließen", aber in dem, was Sie zitiert haben, haben Sie erwähnt "Die angegebenen Namen sind für den automatischen Export nachfolgend ausgeführter Befehle in die Umgebung markiert." - Es muss "einschließen" (automatisch exportiert nach oder Auswirkungen haben) und nicht "ausschließen". Ich bin verwirrt, könnten Sie bitte klarstellen?
George2
1
@ George2: Weitere Informationen finden Sie in meiner bearbeiteten Antwort.
Bis auf weiteres angehalten.
3

Du sagst das

Ich verwende immer den Befehl export, um die Umgebungsvariable festzulegen

Übrigens, Sie haben das so formuliert, als würden Sie wirklich fragen, wie eine Umgebungsvariable bestehen bleibt. Dazu müssten Sie Ihre export VAR="foo"Anweisung in Ihre Datei $ HOME / .bash_profile einfügen (wenn Sie bash verwenden). Wenn diese Umgebungsvariable für alle Benutzer außer root bestehen bleiben soll, fügen Sie sie zu / etc / profile hinzu. Wenn Sie möchten, dass es auch für den Root-Benutzer hinzugefügt wird, legen Sie es in /root/.bash_profile fest.

Dies funktioniert für alle Login-Shells, bei denen bash die Shell der Wahl ist. Für Shells ohne Login müssen Sie .bashrc verwenden. Ich habe keine Erkenntnisse für andere Muscheln anzubieten: D.

Whaley
quelle
2
Möglicherweise möchten Sie den Abschnitt der Bash-Manpage erneut lesen, um zu erfahren, wann diese Dateien bezogen werden.
Bis auf weiteres angehalten.
1
Yup ... Ich habe Login und interaktive verwirrt. Bearbeiten meiner Antwort zum Nachdenken. Danke für die Korrektur!
Whaley
"eine Umgebungsvariable bestehen lassen" - was bedeutet bestehen bleiben?
George2
1
"Persist" bedeutet, dass diese Variable bei jedem Start einer Shell diesen Wert haben soll. Je nach Zweck kann es erforderlich sein, die Variable zu exportieren oder nicht.
Bis auf weiteres angehalten.
1
Das bedeutet, dass Sie es nicht dauerhaft gemacht haben. Versuchen Sie, das zu tun, was Whaley beschrieben hat.
Bis auf weiteres angehalten.
1

Export ist der einfachste Weg, warum also nicht dabei bleiben?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells
BloodPhilia
quelle
2
Die Bourne-Shell erfordert VARIABLE = value; Export VARIABLE
mpez0
1
Das sollte auch funktionieren ...
BloodPhilia
@BloodPhilia, für Bash, nur eine Möglichkeit, Umgebungsvariable festzulegen?
George2
1
@ George2 - Wenn Sie VARIABLE = value verwenden, erstellen Sie eine lokale Variable, die nach der aktuellen Skriptausführung nicht mehr vorhanden ist. Bei Verwendung des Exports erben untergeordnete Prozesse die Variablenwerte von ihrem übergeordneten Prozess. Zum Beispiel: FOO=BAR; executethisprogram Das Programm executethisprogramkennt den Wert der Variablen NICHT FOO. Andererseits bei Verwendung von: FOO=BAR; export FOO; executethisprogram Das Programm executethisprogramkennt den Wert der Variablen FOO.
BloodPhilia
1
Executethisprogram ist kein Unterprozess von "export FOO". Es ist ein Unterprozess (untergeordnetes Element) des Skripts, das es aufruft, oder der interaktiven (Befehlszeilen-) Shell. export FOOist ein Befehl, der die Variable markiert, FOOdamit untergeordnete Prozesse der Umgebung, in der der Befehl ausgegeben wurde, auf sie zugreifen können. Dieses übergeordnete Element kann ein Skript oder eine interaktive Shell sein.
Bis auf weiteres angehalten.
1

Sie können auch so etwas tun:

VAR=val application

Beispielsweise:

LANG=C ls --help

Ausgabe in Englisch.

LANG=pl_PL ls --help

Ausgabe in polnischer Sprache (falls verfügbar).

In der Vergangenheit konnte man in sh VAL = val nicht exportieren. Du musstest

VAL=val; export VAL
Gogiel
quelle
Ich bin verwirrt über "VAR = val application", was bedeutet val und was bedeutet application?
George2
2
In diesen Beispielen wird der Wert der Variablen für die untergeordnete Umgebung ( lsz. B.) festgelegt, ohne den Wert dieser Variablen in der aktuellen (übergeordneten) Umgebung zu beeinflussen.
Bis auf weiteres angehalten.
Ist das Kinderumfeld von was? Ich bin verwirrt.
George2
1
lsist ein Kind des Prozesses, von dem es ausgeführt wurde. Wenn ich lsan einer Eingabeaufforderung tippe, ist die interaktive Shell das übergeordnete und lsdas untergeordnete Element. Wenn ich ein Skript habe, das verwendet, lsist das Skript das übergeordnete und lsdas untergeordnete Skript .
Bis auf weiteres angehalten.