450 Stimmen

Kann ich eine Variable aus einem Bash-Skript ohne Quellen in die Umgebung exportieren?

Angenommen, ich habe dieses Skript:

export.bash:

#! /usr/bin/env bash
export VAR="HALLO, VARIABLE"

Wenn ich das Skript ausführe und versuche auf $VAR zuzugreifen, erhalte ich keinen Wert!

echo $VAR

Gibt es eine Möglichkeit, auf $VAR zuzugreifen, indem ich einfach export.bash ausführe, ohne es zu sourcen?

484voto

Keith Thompson Punkte 240701

Gibt es eine Möglichkeit, auf die Variable $VAR zuzugreifen, indem Sie einfach export.bash ausführen, ohne sie zu sourcen?

Schnelle Antwort: Nein.

Aber es gibt mehrere mögliche Workarounds.

Der offensichtlichste, den Sie bereits erwähnt haben, besteht darin, source oder . zu verwenden, um das Skript im Kontext der aufrufenden Shell auszuführen:

$ cat set-vars1.sh 
export FOO=BAR
$ . set-vars1.sh 
$ echo $FOO
BAR

Ein anderer Weg besteht darin, dass das Skript anstelle des Setzens einer Umgebungsvariable Befehle ausgibt, die die Umgebungsvariable setzen:

$ cat set-vars2.sh
#!/bin/bash
echo export FOO=BAR
$ eval "$(./set-vars2.sh)"
$ echo "$FOO"
BAR

Ein dritter Ansatz besteht darin, dass ein Skript Ihre Umgebungsvariable(n) intern setzt und dann ein angegebenes Kommando mit dieser Umgebung aufruft:

$ cat set-vars3.sh
#!/bin/bash
export FOO=BAR
exec "$@"
$ ./set-vars3.sh printenv | grep FOO
FOO=BAR

Dieser letzte Ansatz kann sehr nützlich sein, ist jedoch unpraktisch für die interaktive Verwendung, da er Ihnen nicht die Einstellungen in Ihrer aktuellen Shell gibt (mit allen anderen Einstellungen und Verlaufsdaten, die Sie aufgebaut haben).

86voto

V H Punkte 8072

Um die VAR-Variable zuerst zu exportieren, ist der logischste und scheinbar funktionierende Weg, die Variable zu sourcen:

. ./export.bash

oder

source ./export.bash

Jetzt, wenn Sie es aus der Hauptschale ausgeben, funktioniert es:

echo $VAR
HELLO, VARIABLE

Jetzt setzen wir VAR zurück:

export VAR=""
echo $VAR

Jetzt werden wir ein Skript ausführen, um die Variable zu sourcen und dann zurückzusetzen:

./test-export.sh
HELLO, VARIABLE
--
.

Der Code: Datei test-export.sh

#!/bin/bash
# Umgebungsvariable sourcen
source ./export.bash

# die Variable im Testskript ausgeben
echo $VAR

# die Variable zurücksetzen
unset VAR
# ein paar gestrichelte Linien ausgeben
echo "---"
# jetzt wird VAR leer zurückgegeben
echo $VAR

Hier ist eine Möglichkeit:

Bitte beachten: Die Exports sind auf das Skript beschränkt, das die Exports in Ihrer Hauptkonsole ausführt - daher würde ich sie für einen cron-Job wie unten angegeben hinzufügen... bezüglich des Befehlsteils nach wie vor fragwürdig: so führen Sie es von Ihrer Shell aus:

Im Befehlsfenster (solange die export.bash Datei mehrere Echo-Werte hat)

IFS=$'\n'; for eintrag in $(./export.bash); do  export $eintrag;  done; ./v1.sh
HELLO THERE
HI THERE

Datei cat v1.sh

#!/bin/bash
echo $VAR
echo $VAR1

Jetzt, solange dies für Ihre Verwendung ist, könnten Sie die Variablen jederzeit für Ihre Skripte verfügbar machen, indem Sie ein Bash-Alias wie folgt verwenden:

myvars ./v1.sh
HELLO THERE
HI THERE

echo $VAR

.

Fügen Sie dies Ihrer [.bashrc-Datei](https://de.wikipedia.org/wiki/Bash(Unixshell)#Installation) hinzu:

function myvars() {
    IFS=$'\n';
    for eintrag in $(./export.bash); do  export $eintrag;  done;

    "$@";

    for eintrag in $(./export.bash); do variable=$(echo $eintrag|awk -F"=" '{print $1}'); unset $variable;
    done
}

Quelle Ihre .bashrc-Datei und Sie können jederzeit wie oben beschrieben vorgehen...

Wie dem auch sei, zurück zu dem Rest davon...

Das hat es global verfügbar gemacht und dann das Skript ausgeführt...

Einfach ausgeben und exportieren!

Datei export.bash

#!/bin/bash
echo "VAR=HELLO THERE"

Jetzt innerhalb des Skripts oder Ihrer Konsole ausführen:

export "$(./export.bash)"

Versuchen Sie es:

echo $VAR
HELLO THERE

Mehrere Werte, solange Sie wissen, was Sie in einem anderen Skript erwarten, können sie mit der obigen Methode verwendet werden:

Datei export.bash

#!/bin/bash
echo "VAR=HELLO THERE"
echo "VAR1=HI THERE"

Datei test-export.sh

#!/bin/bash

IFS=$'\n'
for eintrag in $(./export.bash); do
    export $eintrag
done

echo "Runde 1"
echo $VAR
echo $VAR1

for eintrag in $(./export.bash); do
    variable=$(echo $eintrag|awk -F"=" '{print $1}');
    unset $variable
done

echo "Runde 2"
echo $VAR
echo $VAR1

Jetzt die Ergebnisse

./test-export.sh
Runde 1
HELLO THERE
HI THERE
Runde 2

.

Und das endgültige Update zum automatischen Zuweisen, das Lesen der VARIABELN:

./test-export.sh
Runde 0 - Exportieren und Variablennamen finden -
Aktuelle Variable auf die exportierte Variable setzen und ihren Wert ausgeben
$VAR hat den Wert HELLO THERE
$VAR1 hat den Wert HI THERE
Runde 1 - wir wissen, was exportiert wurde und wir werden bekannte Variablen ausgeben
HELLO THERE
HI THERE
Runde 2 - Wir werden nur die Variablennamen zurückgeben und sie zurücksetzen
Runde 3 - Jetzt erhalten wir nichts zurück

Das Skript:

Datei test-export.sh

#!/bin/bash

IFS=$'\n'
echo "Runde 0 - Exportieren und Variablennamen finden - "
echo "Aktuelle Variable auf die exportierte Variable setzen und ihren Wert ausgeben"
for eintrag in $(./export.bash); do
    variable=$(echo $eintrag|awk -F"=" '{print $1}');
    export $eintrag
    eval aktuelle_variable=\$$variable
    echo "\$$variable hat den Wert $aktuelle_variable"
done

echo "Runde 1 - wir wissen, was exportiert wurde und wir werden bekannte Variablen ausgeben"
echo $VAR
echo $VAR1

echo "Runde 2 - Wir werden nur die Variablennamen zurückgeben und sie zurücksetzen "
for eintrag in $(./export.bash); do
    variable=$(echo $eintrag|awk -F"=" '{print $1}');
    unset $variable
done

echo "Runde 3 - Jetzt erhalten wir nichts zurück"
echo $VAR
echo $VAR1

47voto

mdornfe1 Punkte 1822

Ausführen

set -o allexport

Alle Variablen, die Sie nach diesem Befehl aus einer Datei beziehen, werden in Ihrer Shell exportiert.

source conf-file

Wenn Sie fertig sind mit dem Ausführen, wird der allexport-Modus deaktiviert.

set +o allexport

22voto

Xiaofan Hu Punkte 1404

Ich habe eine interessante und ordentliche Methode gefunden, um Umgebungsvariablen aus einer Datei zu exportieren:

In der Datei env.vars:

foo=test

Testskript:

eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # =>

export eval `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

# eine bessere. "--" stoppt das Verarbeiten von Optionen,
# key=value-Liste als Parameter angegeben
export -- `cat env.vars`
echo $foo         # => test
sh -c 'echo $foo' # => test

13voto

Gonmator Punkte 760

Ein weiterer Workaround, der je nach Fall nützlich sein könnte: Erstellen eines weiteren Bash-Skripts, das die exportierte Variable vererbt. Es handelt sich um einen speziellen Fall von Keith Thompson's Antwort, mit all diesen Nachteilen.

Datei export.bash:

# !/bin/bash
export VAR="HALLO, VARIABLE"
bash

Jetzt:

./export.bash
echo $VAR

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X