1249 Stimmen

Definieren einer Variable mit oder ohne Export

Wofür ist export?

Was ist der Unterschied zwischen:

export name=value

und

name=value

2 Stimmen

22voto

Brian S. Wilson Punkte 491

Es sei darauf hingewiesen, dass Sie eine Variable exportieren und später den Wert ändern können. Der geänderte Wert der Variablen steht den Kindprozessen zur Verfügung. Sobald der Export für eine Variable festgelegt wurde, müssen Sie export -n durchführen, um die Eigenschaft zu entfernen.

$ K=1
$ export K
$ K=2
$ bash -c 'echo ${K-unset}'
2
$ export -n K
$ bash -c 'echo ${K-unset}'
unset

5 Stimmen

Vielen Dank, das ist genau die Information, nach der ich gesucht habe, weil ich ein Skript gesehen habe, das Umgebungsvariablen verwendet und sie dann mit einem neuen Wert "wiederverexportiert" hat, und ich habe mich gefragt, ob das notwendig war.

18voto

John T Punkte 23177

export macht die Variable für alle Shells verfügbar, die von der aktuellen Shell abgezweigt werden.

0 Stimmen

Hallo John, weißt du, ob die Position dieses Exports wichtig ist? Soll ich es unten im Makefile platzieren oder ist es überall in Ordnung?

0 Stimmen

@leolehu export in einer Makefile ist im Allgemeinen eine separate Frage. Schnelle Experimente zeigen, dass der Ort des export vorhersehbar unwichtig ist. (Vorhersehbar, weil make die gesamte Makefile parsen und verarbeiten wird und dann versuchen wird, Abhängigkeiten aufzulösen, um herauszufinden, welche Ziel(e) ausgeführt werden sollen.)

16voto

progalgo Punkte 308

Wie Sie vielleicht bereits wissen, erlaubt UNIX Prozessen, eine Reihe von Umgebungsvariablen zu haben, die Schlüssel/Wert-Paare sind, wobei sowohl Schlüssel als auch Wert Zeichenketten sind. Das Betriebssystem ist dafür zuständig, diese Paare für jeden Prozess getrennt zu halten.

Ein Programm kann über diese UNIX-API auf seine Umgebungsvariablen zugreifen:

  • char *getenv(const char *name);
  • int setenv(const char *name, const char *value, int override);
  • int unsetenv(const char *name);

Prozesse erben auch Umgebungsvariablen von Elternprozessen. Das Betriebssystem ist dafür verantwortlich, eine Kopie aller "envars" zu erstellen, sobald der Kindprozess erstellt wird.

Bash, unter anderen Shells, ist in der Lage, seine Umgebungsvariablen auf Benutzeranfrage zu setzen. Dafür existiert das export.

export ist ein Bash-Befehl zur Setzung von Umgebungsvariablen für Bash. Alle mit diesem Befehl gesetzten Variablen werden von allen Prozessen, die diese Bash erstellen würde, vererbt.

Mehr dazu unter Environment in Bash

Eine weitere Art von Variablen in Bash sind interne Variablen. Da Bash nicht nur eine interaktive Shell ist, sondern tatsächlich ein Skript-Interpreter, wie jeder andere Interpreter (z.B. Python), ist es in der Lage, einen eigenen Satz von Variablen zu halten. Es sollte erwähnt werden, dass Bash (im Gegensatz zu Python) nur Zeichenkettenvariablen unterstützt.

Die Notation zur Definition von Bash-Variablen ist name=value. Diese Variablen bleiben in Bash und haben nichts mit den Umgebungsvariablen des Betriebssystems zu tun.

Mehr dazu unter Shell Parameters (einschließlich Variablen)

Ebenfalls erwähnenswert ist, dass laut dem Bash-Referenzhandbuch:

Die Umgebung für einen einfachen Befehl oder eine Funktion kann vorübergehend ergänzt werden, indem sie mit Parameterzuweisungen versehen wird, wie in Shell Parameters beschrieben. Diese Zuweisungsanweisungen beeinflussen nur die Umgebung, die von diesem Befehl gesehen wird.


Zusammengefasst:

  • export wird verwendet, um eine Umgebungsvariable im Betriebssystem zu setzen. Diese Variable wird für alle Kindprozesse verfügbar sein, die vom aktuellen Bash-Prozess erstellt werden.
  • Die Bash-Variablenschreibweise (name=value) wird verwendet, um lokale Variablen festzulegen, die nur für den aktuellen Prozess von Bash verfügbar sind.
  • Die Bash-Variablenschreibweise, die einem anderen Befehl vorausgeht, erstellt Umgebungsvariablen nur für den Geltungsbereich dieses Befehls.

1 Stimmen

Bash-Variablen unterstützen nicht so viele Typen wie Python, aber sie haben String, Integer und zwei Arten von Arrays ('indexiert'/'traditionell und 'assoziativ', was ähnlich ist wie ein AWK-Array, ein Perl-Hash oder ein Python-Dict). Andere Shells variieren; nur String ist portabel.

0 Stimmen

@dave_thompson_085 - Tatsächlich werden alle als Zeichenfolgen-Arrays gespeichert und bei Bedarf automatisch für arithmetische Operationen usw. umgewandelt. Eine gemeinsame Variable wie A="string" ist tatsächlich identisch mit A[0]="string". Tatsächlich könnten Sie nach A="string" mehr Zeichenfolgen an das 1-String-Array anhängen mit A[1]="string2", A+=(string3 string4 "string 5 is longer") und dann echo "${A[@]}" verwenden, um sie auszugeben. Beachten Sie, dass es etwas wie das Übergeben des Arrays an einen printf-Befehl erfordern würde, um eine Art Trennzeichen zwischen den Zeichenfolgen zu erhalten, da das Standardtrennzeichen ein Leerzeichen ist und string5 Leerzeichen enthält.

0 Stimmen

@DocSalvager: export a b; a=dies; b[0]=das; env | grep ^[ab] ist nicht identisch. In C/C++/Java float und double sind in einigen Situationen austauschbar, aber es handelt sich dennoch um verschiedene Typen.

9voto

flow2k Punkte 3219

Die akzeptierte Antwort impliziert dies, aber ich möchte die Verbindung zu Shell-Builtins explizit machen:

Wie bereits erwähnt, wird export eine Variable sowohl für die Shell als auch für untergeordnete Prozesse verfügbar machen. Wenn export nicht verwendet wird, wird die Variable nur in der Shell verfügbar sein, und nur Shell-Builtins können darauf zugreifen.

Das bedeutet,

tango=3
env | grep tango # gibt nichts aus, da env ein untergeordneter Prozess ist
set | grep tango # gibt tango=3 aus - "type set" zeigt, dass `set` ein Shell-Builtin ist

7voto

Dan Carter Punkte 569

Zwei der Schöpfer von UNIX, Brian Kernighan und Rob Pike, erklären dies in ihrem Buch "The UNIX Programming Environment". Suchen Sie nach dem Titel und Sie werden leicht eine PDF-Version finden.

Sie behandeln Shell-Variablen im Abschnitt 3.6 und konzentrieren sich am Ende dieses Abschnitts auf die Verwendung des export Befehls:

Wenn Sie den Wert einer Variablen in Unter-Shell zugänglich machen möchten, sollte der Shell-Exportbefehl verwendet werden. (Sie könnten darüber nachdenken, warum es keine Möglichkeit gibt, den Wert einer Variablen aus einer Unter-Shell an ihre übergeordnete Shell zu exportieren).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X