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 . oder source, 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 . oder source 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 sagt sudo: 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 mit sudo ausführen. Ich empfehle Ihnen, zu versuchen, Ihr Skript als Quelle zu verwenden, und dann sudo 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.