Was macht der Export in BASH? [Duplikat]

75

Mögliches Duplikat:
Unterschied zwischen "a = b" und "export a = b" in bash

Es ist schwer zuzugeben, aber ich habe nie wirklich verstanden, was genau exportmit einer Umgebungsvariablen geschieht. Ich weiß, dass ich eine Variable in untergeordneten Prozessen manchmal nicht sehen kann, wenn ich sie nicht exportiere, aber manchmal scheint es, als ob ich es kann. Was ist wirklich los, wenn ich sage

export foo=5

und wann soll ich keine variable exportieren

Chas. Owens
quelle
Hier ist ein Link zu mindestens einer weiteren hilfreichen Frage zu diesem Thema: superuser.com/questions/143413/linux-environment-variables ... da diese Frage ironischerweise die erste war, die bei Google für meine Abfrage zum Export in Bash aufgetaucht ist .
Ogre Psalm33
1
Auch: superuser.com/questions/18988/...
Ogre Psalm33
Eine gebräuchliche Verwendung ist das Hinzufügen von exportAnweisungen zu .bashrc / .bash_profile, um persistente globale Variablen ähnlich wie zu erstellen $HOME.
Evan Plaice
Vorsichtig, es gibt mehr in dieser Geschichte, als zunächst erscheint. Ich lade Sie ein, meine Antwort zu überprüfen.
Jasonleonhard

Antworten:

15

Von man bash:

UMGEBUNG

Wenn ein Programm aufgerufen wird, erhält es ein Array von Zeichenfolgen, die als Umgebung bezeichnet werden. Dies ist eine Liste von Name-Wert-Paaren in der Form name = value.

Die Shell bietet verschiedene Möglichkeiten, die Umgebung zu manipulieren. Beim Aufruf überprüft die Shell ihre eigene Umgebung und erstellt für jeden gefundenen Namen einen Parameter, der automatisch für den Export in untergeordnete Prozesse markiert wird. Ausgeführte Befehle erben die Umgebung. Mit den Befehlen export und declare -xkönnen Parameter und Funktionen zur Umgebung hinzugefügt und daraus gelöscht werden. Wenn der Wert eines Parameters in der Umgebung geändert wird, wird der neue Wert Teil der Umgebung und ersetzt den alten. Die Umgebung, die von einem ausgeführten Befehl geerbt wird, besteht aus der ursprünglichen Umgebung der Shell, deren Werte in der Shell geändert werden können, abzüglich der vom unset Befehl entfernten Paare sowie jeglicher Zusätze über den Export und die declare -xBefehle.

sml
quelle
73
IMHO Kopieren Einfügen eines Ausschnitts aus der Dokumentation ohne zusätzlichen Aufwand zu erklären, sollte nicht hochgestuft werden.
Artur
29
Dieser Auszug ist nicht sehr klar und ehrlich gesagt habe ich nicht verstanden, was los ist.
Trismegistos
4
@Artur: im gegenteil: wenn die (auszug aus der) dokumentation eine frage beantwortet, hätte ich lieber keine zusätzlichen erklärungen.
René Nyffenegger
1
@ RenéNyffenegger aber so scheint es nicht. Zumindest habe ich es nicht bekommen, bis ich eine Antwort von BloodPhilia gelesen habe, die als akzeptiert markiert werden sollte.
Vladislav Rastrusny
1
Ich glaube, die Argumente, die Artur und Trismegistos vorbrachten, sind, dass jeder kopieren und einfügen kann, was nicht immer ausreicht, klarstellen und eine gute Antwort geben kann. Es ist in Ordnung, Dokumente zu kopieren, einzufügen oder einen Link bereitzustellen. Dies wird empfohlen, es sollte jedoch eine zusätzliche Erklärung für die Qualität geben. Darüber hinaus kann diese Erklärung von Leuten wie RenéNyffenegger leicht ignoriert werden, wenn sie sie nicht brauchen, aber sie wird für diejenigen da sein, die davon profitieren werden. Wir alle versuchen zu lernen und haben unterschiedliche Wege, wie wir Verständnis gewinnen. Dies hilft dabei, eine Vielzahl von Lernstilen abzudecken und verbessert Ihre Bewertung.
Jasonleonhard
99

Exportierte Variablen werden an untergeordnete Prozesse weitergegeben, nicht exportierte Variablen nicht.

BloodPhilia
quelle
Können Sie auf eine Dokumentation verweisen, die dies betrifft? Ich suche mehr Informationen als das. Muss eine Variable beispielsweise nur einmal exportiert werden oder muss sie nach jeder Änderung exportiert werden usw.
Chas. Owens
1
: Sie können diese Besuche superuser.com/questions/143413/linux-environment-variables/...
BloodPhilia
3
Sie können dies überprüfen, indem Sie etwas zu einem Pfad hinzufügen (sagen wir zu PYTHONPATH) und dann feststellen, dass es, obwohl Sie können echo $PYTHONPATH, erst von Python- oder Bash-Skripten erkannt wird , wenn Sie exportes
tun
Diese Antwort scheint auch nicht ganz richtig zu sein. Bash-Sub-Shells gehören beispielsweise zu Child-Prozessen (gemäß $BASHPID), und dennoch können Sie nicht exportierte Variablen aus der Parent-Shell lesen. Einfacher Beweis: x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") Ich vermute, dass dies ein Sonderfall ist, der auftritt, wenn der untergeordnete Prozess eine Unterschale ist.
4.
20

Wenn Sie verwenden export, fügen Sie die Variable der Umgebungsvariablenliste der Shell hinzu, in der der Exportbefehl aufgerufen wurde, und alle Umgebungsvariablen einer Shell werden an die untergeordneten Prozesse übergeben. Deshalb können Sie sie verwenden.

Wenn Sie die Shell beenden, wird ihre Umgebung zerstört. Aus diesem Grund werden die Umgebungsvariablen beim Anmelden deklariert und exportiert, beispielsweise in der .bashrc-Datei

Alfredozn
quelle