Das Exportieren einer Variablen aus einer Funktion heraus entspricht dem globalen Export dieser Variablen?

10

Ich benutze Ubuntu 16.04 mit dem nativen Bash.

Ich bin nicht sicher, ob ausgeführt

#!/bin/bash
myFunc() {
    export myVar="myVal"
}
myFunc

ist in jeder Hinsicht gleichbedeutend mit der Ausführung export myVar="myVal".

Natürlich sollte eine globale Variable normalerweise außerhalb einer Funktion deklariert werden (eine Frage der Konvention, die ich annehme, auch wenn dies technisch möglich ist), aber ich wundere mich über die exotischeren Fälle, in denen man eine sehr allgemeine Funktion schreibt und eine Variable darin haben möchte immer noch für alles verfügbar sein, überall.

Wäre exporteine Variable in einer Funktion identisch mit dem globalen Export direkt in die CLI, um sie für alle Elemente in der Shell (alle Subshells und Funktionen in ihnen) verfügbar zu machen?

user9303970
quelle

Antworten:

14

Ihr Skript erstellt eine Umgebungsvariable myVarin der Umgebung des Skripts. Das Skript, wie es derzeit dargestellt wird, entspricht funktional genau dem

#!/bin/bash

export myVar="myVal"

Die Tatsache, dass exportdies im Funktionskörper geschieht, ist für den Umfang der Umgebungsvariablen (in diesem Fall) nicht relevant. Es beginnt zu existieren, sobald die Funktion aufgerufen wird.

Die Variable ist in der Skriptumgebung und in der Umgebung aller anderen Prozesse verfügbar, die nach dem Funktionsaufruf vom Skript aus gestartet wurden.

Die Variable ist in der Umgebung des übergeordneten Prozesses (der interaktiven Shell, in der Sie das Skript ausführen) nicht vorhanden, es sei denn, das Skript stammt aus (mit .oder source). In diesem Fall wird das gesamte Skript in der Umgebung der interaktiven Shell ausgeführt (dh der Zweck der "Beschaffung" einer Shell-Datei).

Ohne den Funktionsaufruf selbst:

myFunc() {
    export myVar="myVal"
}

Die Beschaffung dieser Datei würde sich myFuncin der Umgebung der aufrufenden Shell befinden. Durch Aufrufen der Funktion wird dann die Umgebungsvariable erstellt.

Siehe auch die Frage Welche Bereiche können Shell-Variablen haben?

Kusalananda
quelle