Globale Umgebungsvariablen in einem Shell-Skript

82

Wie setze ich eine globale Umgebungsvariable in einem Bash-Skript?

Wenn ich solche Sachen mache

#!/bin/bash
FOO=bar

...oder

#!/bin/bash
export FOO=bar

... die vars scheinen im lokalen Kontext zu bleiben, während ich sie weiterhin verwenden möchte, nachdem das Skript ausgeführt wurde.

Alex
quelle

Antworten:

139

Führen Sie Ihr Skript mit aus .

. myscript.sh

Dadurch wird das Skript in der aktuellen Shell-Umgebung ausgeführt.

export Legt fest, welche Variablen für neue Prozesse verfügbar sind

FOO=1
export BAR=2
./runScript.sh

dann $BARwird in der Umgebung von verfügbar sein runScript.sh, wird aber $FOOnicht.

Mob
quelle
27
Sei vorsichtig mit dem ersten. Ohne einen Schrägstrich wird es in Ihrem Weg aussehen: Verwenden Sie etwas wie '. ./myscript.sh ', wenn Sie sicherstellen möchten, dass eine bestimmte ausgeführt wird.
Paxdiablo
13
sourceist ein Alias ​​für .. Sie könnten also source myscript.shstattdessen laufen , wenn Sie expliziter sein möchten.
Ehtesh Choudhury
Ich frage mich, was passiert, wenn ich ein Skript mit Punkt und Leerzeichen ausführe. Beispiel. Myscript
cNgamba
54

Wenn Sie ein Shell-Skript ausführen , erfolgt dies in einer Sub-Shell, sodass die Umgebung der übergeordneten Shell nicht beeinträchtigt werden kann. Sie möchten das Skript wie folgt beschaffen:

. ./setfoo.sh

Dies führt es im Kontext der aktuellen Shell aus, nicht als Sub- Shell.

Von der Bash-Manpage:

. Dateiname [Argumente]
Quelldateiname [Argumente]

Lesen und Ausführen von Befehlen aus dem Dateinamen in der aktuellen Shell-Umgebung und Zurückgeben des Beendigungsstatus des zuletzt aus dem Dateinamen ausgeführten Befehls.

Wenn der Dateiname keinen Schrägstrich enthält, werden Dateinamen in PATH verwendet, um das Verzeichnis zu finden, das den Dateinamen enthält.

Die in PATH gesuchte Datei muss nicht ausführbar sein. Wenn sich bash nicht im POSIX-Modus befindet, wird das aktuelle Verzeichnis durchsucht, wenn in PATH keine Datei gefunden wird.

Wenn die Quellpfadoption für den eingebauten Befehl shopt deaktiviert ist, wird der Pfad nicht durchsucht.

Wenn Argumente angegeben werden, werden diese zu Positionsparametern, wenn der Dateiname ausgeführt wird.

Ansonsten bleiben die Positionsparameter unverändert. Der Rückgabestatus ist der Status des letzten im Skript beendeten Befehls (0, wenn keine Befehle ausgeführt werden) und false, wenn der Dateiname nicht gefunden wird oder nicht gelesen werden kann.

paxdiablo
quelle
Interessant - ich habe diese Syntax noch nie gesehen. Entspricht dies der Quelle ./setfoo.sh?
ire_and_curses
2
Es ist das gleiche, nur schneller zu tippen (und auf älteren Systemen kompatibler - ksh hat keinen Quellbefehl, aber '.').
Paxdiablo
9

source myscript.sh ist auch machbar.

Beschreibung für den Linux-Befehl source:

source is a Unix command that evaluates the file following the command, 
as a list of commands, executed in the current context
CDT
quelle
Vielleicht nur ein bisschen mehr Details hier. Wie wäre es mit einer sehr kurzen Beschreibung dessen, was sourcetut?
Phillip Cloud
@PhillipCloud Geben Sie man sourcedas Terminal ein und Sie erhalten, was Sie wollen.
CDT
5
Ich bin vertraut mit source. Vielleicht ist das OP nicht.
Phillip Cloud
2
@PhillipCloud Ich hätte gerne selbst mehr Details. Wenn Sie die Antwort bearbeiten möchten, können Sie dies definitiv tun. Helfen Sie der Sache und all dem ... Danke!
Dan Rosenstark
4
#!/bin/bash
export FOO=bar

oder

#!/bin/bash
FOO=bar
export FOO

Mann Export:

Die Shell gibt den Variablen, die den angegebenen Namen entsprechen, das Exportattribut, wodurch sie sich in der Umgebung von anschließend ausgeführten Befehlen befinden. Wenn auf den Namen einer Variablen = word folgt, wird der Wert dieser Variablen auf word gesetzt.

Andrejs Cainikovs
quelle
Bitte an alle Anfänger in Shell-Skripten: Beachten Sie, dass zwischen dem envvar-Namen, dem Zeichen '=' und dem Wert selbst kein Leerzeichen steht. das würde nicht funktionieren:export FOO = /mydir/bar
russellhoff
-3
FOO=bar
export FOO
Niko
quelle
2
Dies funktioniert nicht, es wird die Umgebungsvariable für den übergeordneten Prozess nicht festgelegt.
Dreamlax
3
Nur der übergeordnete Prozess kann eine Umgebungsvariable für den übergeordneten Prozess festlegen.
Glenn Jackman