Was macht der Befehl 'export'?

85

Ich bin ein wenig neu in Linux und führe einige Befehle blind aus, um Dinge zu erledigen. Ich dachte, dass es keine Verschwendung sein wird, solche Fragen zu stellen, da mehr neue Leute regelmäßig darüber Bescheid wissen würden.

Ich habe kürzlich angefangen, mit Jenkins zu arbeiten , und dann musste ich diesen exportBefehl verwenden, um das Jenkins-Kriegsarchiv auszuführen . Ich musste also wissen, was der exportBefehl im Allgemeinen tut und warum wir diesen Befehl ausführen müssen, während wir Jenkins ausführen (nachdem das Jenkins-Home festgelegt wurde).

Vielen Dank!

Chathura Kulasinghe
quelle
1
Es wäre hilfreich, wenn Sie mehr über den von Ihnen verwendeten Exportbefehl sagen würden. Ohne mehr Kontext würde ich vermuten, dass Sie eine Umgebungsvariable festgelegt haben. Siehe en.wikipedia.org/wiki/Environment_variable#Unix
Joshua D. Boyd
4
Mögliches Duplikat von Bash: Definieren einer Variablen mit oder ohne Export
Tripleee
Mögliches Duplikat des Unix-Exportbefehls
John Kugelman

Antworten:

99

exportIn shund verwandten Shells (z. B. bash) wird eine Umgebungsvariable markiert, die in untergeordnete Prozesse exportiert werden soll, damit das untergeordnete Element sie erbt.

exportist in POSIX definiert :

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. Wenn auf den Namen einer Variablen = word folgt, wird der Wert dieser Variablen auf word gesetzt.

Yann Ramin
quelle
Vielen Dank! Alle Ihre Antworten waren wirklich hilfreich, und sie führen Sie, um noch ein paar Dinge zu lernen! :-)
Chathura Kulasinghe
1
Was ist ein Kinderprozess in diesem Sinne?
Zinan Xing
13
Verstehe nicht
Martin Hansen
@ MartinHansen was verstehst du nicht? Siehe auch meine Antwort.
Barlop
Es gibt eine zusätzliche eckige Klammer am Ende des Links, ich kann es nicht bearbeiten, weil es ein Symbol bearbeiten :)
Radoslav Stoyanov
27

Ich denke, Sie kommen aus einem Windows-Hintergrund. Also werde ich sie kontrastieren (ich bin auch ein bisschen neu in Linux). Ich fand die Antwort des Benutzers auf meinen Kommentar nützlich, um Dinge herauszufinden.

In Windows kann eine Variable permanent sein oder nicht. Der Begriff Umgebungsvariable umfasst eine Variable, die in der cmd-Shell mit dem Befehl SET festgelegt wurde, sowie wenn die Variable in der Windows-GUI festgelegt und somit in der Registrierung festgelegt wurde und in neuen cmd-Fenstern angezeigt werden kann. zB Dokumentation für den Befehl set in Windows https://technet.microsoft.com/en-us/library/bb490998.aspx "Zeigt Umgebungsvariablen an, legt sie fest oder entfernt sie. Wird ohne Parameter verwendet, zeigt set die aktuellen Umgebungseinstellungen an." Unter Linux zeigt set keine Umgebungsvariablen an, sondern Shell-Variablen, die nicht als Umgebungsvariablen bezeichnet werden. Außerdem verwendet Linux set nicht zum Festlegen von Variablen (abgesehen von Positionsparametern und Shell-Optionen, die ich am Ende als Hinweis erläutere), sondern nur zum Anzeigen und selbst dann nur zum Anzeigen von Shell-Variablen. Windows verwendet set zum Einstellen und Anzeigen, z. B. set a = 5, Linux nicht.

Unter Linux können Sie vermutlich ein Skript erstellen, das beim Booten Variablen festlegt, z. B. /etc/profileoder /etc/.bashrcansonsten sind sie nicht permanent. Sie sind im RAM gespeichert.

Unter Linux wird zwischen Shell-Variablen und Umgebungsvariablen unterschieden. Unter Linux befinden sich Shell-Variablen nur in der aktuellen Shell, und Umgebungsvariablen befinden sich in dieser Shell und allen untergeordneten Shells.

Sie können Shell-Variablen mit dem setBefehl anzeigen (beachten Sie jedoch, dass Variablen im Gegensatz zu Windows nicht mit dem Befehl set unter Linux festgelegt werden).

set -o posix; set (Wenn Sie dieses Set -o zuerst einmal ausführen, wird nicht zu viel unnötiges Material angezeigt.) So setzeigt Shell - Variablen.

Sie können Umgebungsvariablen mit dem envBefehl anzeigen

Shell-Variablen werden zB mit just gesetzt a = 5

Umgebungsvariablen werden mit export festgelegt, export legt auch die Shell-Variable fest

Hier sehen Sie die Shell-Variable zzz, die mit zzz = 5 gesetzt ist, und sie wird beim Ausführen angezeigt set, jedoch nicht als Umgebungsvariable.

Hier sehen wir yyy mit export gesetzt, also ist es eine Umgebungsvariable. Und siehe, es wird sowohl unter Shell-Variablen als auch unter Umgebungsvariablen angezeigt

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

andere nützliche Themen

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/environment-variable-vs-shell-variable-whats-the-difference

Hinweis: Ein Punkt, der ein wenig näher ausgeführt wird und etwas korrigiert, was ich geschrieben habe, ist, dass in Linux Bash 'set' verwendet werden kann, um "Positionsparameter" und "Shell-Optionen / Attribute" festzulegen, und technisch beides Dies sind Variablen, obwohl die Manpages sie möglicherweise nicht als solche beschreiben. Wie bereits erwähnt, setzt set jedoch keine Shell-Variablen oder Umgebungsvariablen. Wenn Sie dies tun set asdf, wird $ 1 auf asdf gesetzt, und wenn Sie dies tun echo $1, sehen Sie asdf. Wenn Sie tunset a=5Die Variable a wird nicht gleich 5 gesetzt. Der Positionsparameter $ 1 wird gleich der Zeichenfolge "a = 5" gesetzt. Wenn Sie also jemals gesehen haben, dass unter Linux a = 5 gesetzt ist, ist dies wahrscheinlich ein Fehler, es sei denn, jemand wollte diese Zeichenfolge a = 5 in $ 1. Das andere, was Linux einstellen kann, sind Shell-Optionen / Attribute. Wenn Sie -o setzen, sehen Sie eine Liste von ihnen. Und Sie können zum Beispiel set -o verboseaus, um ausführlich zu schalten (übrigens ist die Standardeinstellung aus, aber das macht keinen Unterschied). Oder Sie können tun set +o verbose, um ausführlich zu deaktivieren. Windows hat keine solche Verwendung für seinen Befehl set.

Barlop
quelle
sieht aus wie Set zeigt Shell und Umgebung, und 'env' zeigt nur Umgebung
Barlop
1
Diese Antwort gefällt mir sehr gut, da sie Fälle von Nix gegen Win abdeckt, die zunächst verwirrend sein können.
Nichts
6

In einfachen Worten, Umgebungsvariablen werden festgelegt, wenn Sie eine neue Shell-Sitzung öffnen. Wenn Sie einen der Variablenwerte ändern, kann die Shell diese Änderung jederzeit nicht auswählen. Das bedeutet, dass die von Ihnen vorgenommenen Änderungen in neuen Shell-Sitzungen wirksam werden. Der exportBefehl bietet andererseits die Möglichkeit, die aktuelle Shell-Sitzung über die Änderung zu aktualisieren, die Sie an der exportierten Variablen vorgenommen haben. Sie müssen nicht bis zur neuen Shell-Sitzung warten, um den Wert der von Ihnen geänderten Variablen zu verwenden.

Katwekibs
quelle
1
Aber wenn ich a=5dann sage, dann echo $aheißt es 5. Sie haben jedoch geschrieben: "Wenn Sie einen der Variablenwerte jederzeit ändern, kann die Shell diese Änderung nicht auswählen. Dies bedeutet, dass die von Ihnen vorgenommenen Änderungen in neuen Shell-Sitzungen wirksam werden." . <- Wie wurde die Shell-Sitzung ohne Export aktualisiert? Können Sie ein Beispiel geben, wo ein Export notwendig ist?
Barlop
Die Variable, die Sie während einer Shell-Sitzung festlegen, ist eine Shell-Variable. Es ist lokal und für die aktuelle Shell-Sitzung zugänglich. Sie können es jederzeit ändern und sein aktueller Wert steht dem aktuellen Shell-Prozess zur Verfügung, ohne dass Änderungen exportiert werden müssen. Andererseits werden Umgebungsvariablen zum Zeitpunkt der Anmeldung festgelegt. Wenn Sie einen ihrer Werte ändern, müssen Sie eine Aktualisierung durchführen, um den neuen Wert sowohl für den aktuellen Shell-Prozess als auch für alle neuen untergeordneten Prozesse verfügbar zu machen. Genau das macht der Export.
Katwekibs