Was machen die Bash-Builtins 'Set' und 'Export'?

46

Ich bin ein bisschen ratlos in Bezug auf den Zweck von setund exportin Bash (und ich denke, wahrscheinlich auch andere Shells).

Ich würde denken, es ist für das Setzen von Umgebungsvariablen, aber das kann einfach mit gemacht werden VARIABLE=VALUE, oder?

Auch beim Tippen setund exportfür sich alleine zeigen sich unterschiedliche Werte.

Also, was ist ihr Zweck?

Mydoghaswürmer
quelle
Ich beginne immer mit einem Bash-Skript mit den folgenden beiden. #! / usr / bin / env bash set -euxo pipefail Dieser Link erklärt genau dasselbe. coderwall.com/p/fkfaqq/…
147,3k

Antworten:

50

exportExporte an untergeordnete Elemente des aktuellen Prozesses. Standardmäßig werden sie nicht exportiert. Zum Beispiel:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

setSetzt dagegen Shell-Attribute, beispielsweise die Positionsparameter.

$ set foo=baz
$ echo "$1"
foo=baz

Beachten Sie, dass dies baznicht zugewiesen ist foo, sondern lediglich ein wörtlicher Positionsparameter wird. Es gibt viele andere Dinge, die setman tun kann (meistens Shell-Optionen), siehe help set.

Beim Drucken exportohne Argumente werden alle Variablen in der Shell-Umgebung gedruckt . setdruckt auch Variablen, die nicht exportiert werden. Es kann auch einige andere Objekte exportieren (obwohl Sie beachten sollten, dass dies nicht portierbar ist), siehe help export.

Chris Down
quelle
Danke, das ist eine sehr nützliche Antwort. Wenn ich jedoch http_proxy nur mit http_proxy = abc.com einstelle , ist es für untergeordnete Prozesse sichtbar, z. B. das Ausführen von wget, ohne dass ich es exportiere. Wie kann das sein?
Mydoghasworms
2
@mydoghasworms Zwei mögliche Gründe. Erstens führen Sie den Befehl als aus foo=bar command. Dies ist ein impliziter Export für einen einzelnen Befehl. Die zweite Möglichkeit besteht darin, dass http_proxybereits in Ihre Umgebung exportiert wird, bevor Sie sie ändern.
Chris Down
Ah ja, du hast recht. Genial, danke!
Mydoghasworms
6

See help set: set wird verwendet, um Shell-Attribute und Positionsattribute festzulegen.

Variablen, die nicht exportiert werden, werden nicht an untergeordnete Prozesse vererbt. exportwird verwendet, um eine Variable für den Export zu markieren.

Choroba
quelle