Wofür ist export
?
Was ist der Unterschied zwischen:
export name=value
und
name=value
Wofür ist export
?
Was ist der Unterschied zwischen:
export name=value
und
name=value
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
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?
@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.)
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.
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.
@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.
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
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 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.
2 Stimmen
Siehe auch: stackoverflow.com/questions/68529921/…