Wie kann ich Umgebungsvariablen in ein Shell-Skript "exportieren"?

54

Ich habe mehrere Amazon EC2-Konten und möchte schnell in der Lage sein, Variablen zu wechseln, z. B. $EC2_HOMEmithilfe eines Skripts.

Ich habe ein Shell-Skript wie folgt eingerichtet:

#!/bin/sh
export EC2_HOME=/home/me/.ec2
echo $EC2_HOME

Wenn ich das Skript ausführe, weiß ich, dass EC2_HOMEdas festgelegt ist, aber ich dachte, dass exportdie Variable durch die Verwendung von " hängen bleiben" würde, nachdem das Skript abgeschlossen wurde. Es funktioniert nicht, da beim Laufen echo $EC_HOMEnichts angezeigt wird.

Ich weiß, dass dies sehr rudimentäre Linux-Skriptkenntnisse sein müssen, aber ich weiß es nicht. Ich habe ohne Glück versucht, nach ähnlichen Fragen zu suchen. Ich entschuldige mich, wenn dies ein Duplikat ist.

cwd
quelle

Antworten:

60

Sie sollten Ihr Skript mit

. ./script

oder

source ./script
Enzotib
quelle
19
Der Grund dafür ist, dass Ihr Skript einen neuen Shell-Prozess als untergeordnetes Element der aktuellen Shell erzeugt. Änderungen an der Umgebung, die Sie im untergeordneten Prozess vornehmen, wirken sich nicht auf den übergeordneten Prozess aus . Wenn Sie mit .oder sourcekeinen neuen untergeordneten Prozess erzeugen, führen Sie die Befehle in der aktuellen Shell aus.
Glenn Jackman
1
@glennjackman Ich habe ein ähnliches Problem und ich habe Ihre Lösung ausprobiert, aber es meldet mich von der Shell ab, wenn ich .oder source. Warum passiert dies ?
Patryk
7
@Patryk: Vielleicht hat Ihr Skript eine exitAussage, daher ist es nicht geeignet, eine Quelle zu haben.
Enzotib
Während source ./scriptfunktioniert ganz gut, sudo source ./script.shsagt sudo: source: command not found. Wie kann ich das mit sudo machen?
71GA
1
@ 71GA: Abhängig von den Kompilierungseinstellungen sudound den Konfigurationseinstellungen in können /etc/sudoersSie Ihre Umgebung nicht erhalten, wenn Sie Befehle mit ausführen sudo. Ich empfehle Ihnen, Ihr Skript als Quelle zu verwenden und dann sudomit der -EOption auszuführen , um die Umgebung zu schonen. Wenn es nicht funktioniert, gibt es vermutlich sehr wenig, was Sie tun können.
Enzotib
35

Wenn Sie ein Skript ausführen, erhält es eine eigene Shell und eine eigene Umgebung, die wieder verschwinden, sobald das Skript beendet ist. Um die Umgebungsvariablen beizubehalten, geben Sie das Skript in Ihre aktuelle Shell ein:

$ source ./a.sh

oder gleichwertig (aber etwas portabler) den POSIX-Punktbefehl verwenden :

$ . ./a.sh

Anschließend werden die Definitionen in die aktuelle Shell-Umgebung eingefügt und von allen Programmen übernommen, die Sie von dort aus starten.

Um dem Ausführen eines Skripts näher zu sein, . a.shwird a.sh durch Durchsuchen der Verzeichnisse in der PATHUmgebungsvariablen gefunden.


Es gibt einige Feinheiten, wie diese sich verhalten, und ob .und sourcesind die gleichen (oder haupt vorhanden). . ./a.shwird sich auf jeden Fall in jeder POSIX-kompatiblen Shell gleich verhalten, aber sourceund .und . a.shund . ./a.shkönnen variieren. Für Bash sourceund .sind gleich in allen Fällen; Bei zsh wird sourceimmer zuerst das aktuelle Verzeichnis überprüft . ksh ist im Wesentlichen ähnlich.

Wenn der Skriptname als Pfad angegeben wird (der ein enthält /), wird dieser Pfad in allen Fällen direkt verwendet. Das tragbarste, was man tun kann, ist . ./scriptoder . /path/to/script.

Michael Homer
quelle
1

Nur zur Kenntnisnahme.

Wenn Sie ein Skript aus dem Internet ausführen möchten, das env in das System exportiert

Sie können folgendes Format verwenden

source <(curl -s -L https://raw.githubusercontent.com/iamwwc/wwcdocker/master/install.sh)

Zum Beispiel:

source <(curl -s -L https://example.com/install.sh)
Toffee
quelle
Sieht gefährlich aus, ist aber nützlich, wenn Sie diesem Skript vertrauen!
Mark Stewart