Ich habe mehrere Amazon EC2-Konten und möchte schnell in der Lage sein, Variablen wie $EC2_HOME
mit zu wechseln ein Skript.
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_HOME
ist festgelegt, aber ich dachte, dass die Verwendung von export
dazu führen würde, dass die Variable nach Abschluss des Skripts erhalten bleibt. Dies ist nicht der Fall, da das Ausführen von echo $EC_HOME
nichts anzeigt.
Ich weiß, dass dies sehr rudimentäres Linux-Skriptwissen sein muss, aber ich weiß es nicht Ich habe versucht, ohne Glück nach verwandten Fragen zu suchen. Ich entschuldige mich, wenn dies ein Duplikat ist.
Antwort
Sie sollten Ihr Skript als Quelle verwenden. mit
. ./script
oder
source ./script
Kommentare
- 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, können keine Auswirkungen auf das übergeordnete Element haben. Wenn Sie
.
odersource
, Sie erzeugen keinen neuen untergeordneten Prozess, sondern führen die Befehle in der aktuellen Shell aus. - @glennjackman Ich habe ein ähnliches Problem und habe Ihre Lösung ausprobiert, aber es meldet mich von der Shell ab, wenn ich
.
odersource
mache. Warum ist das so? pening? - @Patryk: Möglicherweise hat Ihr Skript eine
exit
-Anweisung, sodass es nicht für die Beschaffung geeignet ist. - While
source ./script
funktioniert einwandfrei,sudo source ./script.sh
sagtsudo: source: command not found
. Wie kann ich dies mit sudo tun? - @ 71GA: abhängig von den Kompilierungseinstellungen für
sudo
und abhängig von den Konfigurationseinstellungen in/etc/sudoers
Sie können Ihre Umgebung erhalten oder nicht, wenn Sie Befehle mitsudo
ausführen. Ich empfehle Ihnen, zu versuchen, Ihr Skript als Quelle zu verwenden, und dannsudo
mit der Option-E
auszuführen, um die Umgebung zu erhalten. Wenn es nicht funktioniert, können Sie vermutlich nur sehr wenig tun.
Antwort
Wenn Sie ausführen Als Skript erhält es eine eigene Shell und eine eigene Umgebung, die wieder verschwinden, sobald das Skript fertig ist. Um die Umgebungsvariablen beizubehalten, geben Sie das Skript in Ihre aktuelle Shell ein:
$ source ./a.sh
oder verwenden Sie äquivalent (aber etwas portabler) die POSIX-Punktbefehl :
$ . ./a.sh
Anschließend werden die Definitionen in die Umgebung Ihrer aktuellen Shell eingefügt und vererbt
findet a.sh a.sh, indem Sie die Verzeichnisse in PATH
Umgebungsvariable.
Es gibt einige Feinheiten, wie sich diese verhalten und ob .
und source
sind gleich (oder überhaupt vorhanden). . ./a.sh
verhält sich definitiv in jeder POSIX-kompatiblen Shell gleich, aber source
und .
und . a.sh
und . ./a.sh
können variieren Für Bash source
und .
sind in allen Fällen gleich ; für zsh source
überprüft immer zuerst das aktuelle Verzeichnis ; ksh ist im Wesentlichen ähnlich.
Wenn der Skriptname als Pfad angegeben wird (der eine /
enthält), wird dieser Pfad direkt verwendet auf alle Fälle. Am zuverlässigsten ist . ./script
oder . /path/to/script
.
Antwort
Nur zur Aufzeichnung.
Wenn Sie ein Skript aus dem Internet ausführen möchten, das env in das System exportiert
, können Sie das folgende 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)
Kommentare
- Sieht gefährlich, aber nützlich aus, wenn Sie diesem Skript vertrauen!
Antwort
Versuchen Sie
exec ./script
Der Befehl exec führt das Skript in der aktuellen Shell aus, ohne eine nicht interaktive Shell zu starten.