2016-04-27 11 views
0

Aus was ich gelesen habe, ist es richtig anzunehmen, dass der einzige Export die Variablen für untergeordnete Prozesse sichtbar macht?In bash, wenn Variablen erstellt werden. Wann exportieren und wann nicht exportieren?

In welchem ​​Szenario würden Sie eine Variable nur für den Bereich sichtbar machen, in dem sie initialisiert wurde, und in welchem ​​Szenario wäre eine Variable für alle untergeordneten Bereiche verfügbar?

+1

Scope! = Prozess. Eine Shellvariable ist für alle untergeordneten Bereiche innerhalb desselben Prozesses verfügbar, ohne sie zu exportieren. – chepner

+0

@chepner Verstanden. Ich schätze, wie kommt dann der Export ins Spiel? – vkapustin

Antwort

2

Im Allgemeinen müssen Sie nur eine Variable exportieren, die ein anderer Prozess in seiner Umgebung sucht. Woher weißt du, welche Variablen das sind? Sie müssen ihre Dokumentation lesen.

Ob eine Variable für den Export markiert ist, macht keine Differenz zur aktuellen Shell.

Lassen Sie uns eine Demonstration konstruieren.

$ printf 'echo "foo=$foo"\n' > script 
$ bash script 
foo= 
$ foo=3 
$ bash script 
foo= 
$ export foo 
bash script 
foo=3 

Das erste Mal und Sekunden Zeit, die Sie script ausführen, wird foo in seiner Umgebung nicht definiert, weil seine Eltern-Prozess (der aktuell Shell) nicht foo nicht ausführte. Beim dritten Aufruf wird die ursprüngliche Umgebung des Skripts um foo erweitert, da foo exportiert wurde.


Als Antwort auf Ihren Kommentar hat der Begriff "Umwelt" hier eine sehr genaue Bedeutung. Alle Prozesse, nicht nur Shells, erhalten beim Start ein Array von Strings vom übergeordneten Objekt, das als Umgebung bezeichnet wird. Diesen Zeichenfolgen sind keine bestimmten Semantiken zugeordnet. Es hängt vom empfangenden Programm ab, wie sie zu interpretieren sind. Die Shell ignoriert beispielsweise Zeichenfolgen in ihrer Umgebung, die nicht das Format name=value haben, wobei name eine gültige Shell-ID ist. Für jede solche Zeichenfolge definiert die Shell eine Shellvariable mit dem angegebenen Namen und Wert und kennzeichnet ihr Exportattribut. Das meinen wir mit einer Umgebungsvariablen. Sie können eine reguläre Shell-Variable auch jederzeit mithilfe des Befehls export an eine Umgebungsvariable "heraufstufen". Dies hat jedoch keinen Einfluss auf die Bedeutung der Variablen im aktuellen Prozess.

Wenn ein Prozess einen neuen Prozess erstellt, wird eine Kopie seiner Umgebung an den neuen Prozess übergeben. Die Shell erzeugt zusätzlich name=value Strings, die von jeder ihrer Umgebungsvariablen weitergeleitet werden.

+0

Danke! Das fängt an mehr Sinn zu machen. Es fällt mir immer noch schwer, den Unterschied zwischen einer Hülle und einer Umgebung zu erkennen. Wenn ich Terminal auf OSX öffne, öffne ich eine neue Umgebung? – vkapustin

+0

Ich würde nicht "ein anderes Programm" sagen, weil nur untergeordnete Prozesse Zugriff auf exportierte Variablen haben können, während andere Programme dies nicht tun. – Harald

+0

@Harald Danke. Ich habe mich dabei ertappt, wie ich oft "Programm" tippte, wo ich "Prozess" sagen wollte; dieser kam vorbei. – chepner

Verwandte Themen