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?

0voto

Dan Bray Punkte 6353

Ich glaube nicht, dass dies möglich ist, aber ich habe einen Workaround gefunden, der alias verwendet. Es funktioniert nur, wenn Sie Ihr Skript in Ihrem Skriptverzeichnis platzieren. Andernfalls hat Ihr Alias einen ungültigen Namen.

Der einzige Zweck des Workarounds besteht darin, eine Funktion in einer Datei mit demselben Namen zu haben und sie nicht vor der Verwendung laden zu müssen. Fügen Sie den folgenden Code zur Datei ~/.bashrc hinzu:

alias myFunction='unalias myFunction && . myFunction && myFunction "$@"'

Sie können nun myFunction aufrufen, ohne es zuvor geladen zu haben.

0voto

ciobi Punkte 87

Dieser Workaround wird irgendwo anders angedeutet, aber vielleicht nicht so klar:

In Ihrem Skript, nachdem Sie die Variable gesetzt haben, starten Sie eine neue Shell, anstatt zurückzukehren.

Meine Anwendungsfälle sind so, dass ich eine Reihe von Terminals offen habe und in einigen von ihnen möchte ich einige Werte für bestimmte Variablen, während ich in anderen andere Werte haben möchte.

Da es schwieriger sein kann, sich an source zu erinnern, besteht ein kleiner Vorteil dieses Ansatzes darin, dass es eine Weile dauert, bis einem auffällt, dass man vergessen hat, source zu verwenden, und man von vorne beginnen muss.

(Für mich ergibt es mehr Sinn, source script zu verwenden, da die fehlenden Variablen sofort bemerkt werden.)

0voto

oml Punkte 103

Ich hatte ein ähnliches Problem beim Aufruf von ssh-agent -s in einem Skript, das von der Option -e in rsync aufgerufen wurde.

Im Skript eval $(ssh-agent -s) werden die Umgebungsvariablen für den nächsten Aufruf nicht beibehalten.

rsync -e 'source ssh-check-agent.sh -p 8022' funktioniert nicht, daher habe ich einen Workaround erstellt. Im Skript habe ich die Variablen nach dem Aufruf von ssh-agent in einer temporären Datei gespeichert:

echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK;" > /tmp/ssh-check-agent.vars
echo "export SSH_AGENT_PID=$SSH_AGENT_PID;" >> /tmp/ssh-check-agent.vars

Und danach rufe ich im Skript, das rsync aufruft (backup.sh), folgendes auf:

source /tmp/ssh-check-agent.vars

Das Problem ist, dass das Skript, das rsync aufruft, über source aufgerufen werden muss (source backup.sh).

Ich weiß, dass das nicht die Frage ist (ich verwende zweimal source), aber ich füge es hier ein, falls jemand ein ähnliches Problem mit rsync hat.

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