Übergeben Sie alle Variablen von einem Shellscript zum anderen?
So können sagen, ich habe ein Shell-Script /bash-Skript mit dem Namen test.sh
mit:
#!/bin/bash
#
TESTVARIABLE=hellohelloheloo
./test2.sh
meine test2.sh sieht so aus
#!/bin/bash
#
echo ${TESTVARIABLE}
funktioniert das nicht. Ich will nicht alle übergeben Sie Variablen als Parameter, da imho das ist übertrieben. Gibt es einen anderen Weg?
Kommentar zu dem Problem - Öffnen
Eine Idee ist, speichern Sie die Variablen in eine Datei und laden Sie dann in einem anderen Skript.
@Rodrigo ich habe ein ähnliches Konzept vor für die "speichern" - Werte zwischen läuft ein Skript, mit einigem Erfolg. Nur eine Sache zu beachten ist, ist, dass, wenn mehrere Instanzen des Skripts, das könnte heikel. Aber wenn Sie speichern Sie Sie in der bash-Zuordnung Formular können Sie nur die Quelle der zu importierenden Datei die Variablen
InformationsquelleAutor der Frage Toskan | 2012-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie grundsätzlich zwei Optionen:
export TESTVARIABLE
) vor dem ausführen der 2. script.. test2.sh
und es laufen in der gleichen shell. Damit würden Sie mehr teilen, komplexe Variablen wie arrays leicht, aber auch bedeutet, dass das andere Skript ändern könnte, Variablen im source-shell.UPDATE:
Verwenden
export
eine Umgebungsvariable gesetzt werden, können Sie entweder eine bestehende variable:Diese sollten auf die Arbeit in beiden
bash
undsh
.bash
es gestattet auch kombiniert werden, etwa so:Funktioniert das auch in meine
sh
(was passiert zu seinbash
verwenden, können Sieecho $SHELL
zu prüfen). Aber ich glaube nicht, dass das unbedingt funktionieren in allensh
, also am besten auf Nummer sicher gehen und trennen Sie Sie.Jede variable, die Sie exportieren, auf diese Weise wird sichtbar in Skripts, die Sie ausführen, zum Beispiel:
ein.sh:
b.sh:
Dann:
Die Tatsache, dass diese beiden shell-Skripte ist auch nur nebensächlich. Umwelt-Variablen, die übergeben werden kann, um jeden Prozess, den Sie ausführen, zum Beispiel wenn wir python statt es Aussehen könnte:
ein.sh:
b.py:
Sourcing:
Stattdessen könnten wir Quelle:
ein.sh:
b.sh:
Dann:
Diese mehr oder weniger "importiert" den Inhalt
b.sh
direkt ein und führt es in die gleichen shell. Beachten Sie, dass wir nicht haben, exportieren Sie die variable zugreifen können. Damit werden implizit alle Anteile der Variablen, die Sie haben, so gut können die anderen Skripts zum hinzufügen/löschen/ändern von Variablen in der shell. Natürlich, in diesem Modell sowohl Ihre Skripts sollte die gleiche Sprache (sh
oderbash
). Um ein Beispiel zu geben, wie wir konnten, pass Nachrichten hin und her:ein.sh:
b.sh:
Dann:
Dies funktioniert ebenso gut in
bash
. Es macht es auch einfach, mehr zu teilen, komplexe Daten, die Sie konnte nicht Ausdrücken, wie eine Umgebungsvariable (zumindest ohne einige schweres heben), wie arrays und assoziativen arrays.InformationsquelleAutor der Antwort FatalError
Fatal Error gab eine einfache Möglichkeit: die Quelle Ihrer zweiten Skript! wenn Sie besorgt sind, dass dieses zweite Skript verändern können, einige Ihrer wertvollen Variablen, können Sie immer die Quelle, die er in einer subshell:
Den Klammern wird die Quelle geschehen in einer subshell, so dass die Eltern-shell nicht sehen, die änderungen
test2.sh
durchführen könnte.Gibt es eine andere Möglichkeit, dass sollte auf jeden Fall darauf verwiesen werden, hier: Verwendung
set -a
.Aus der POSIX
set
- Referenz:Aus der Bash-Manual:
Also in deinem Fall:
Beachten Sie, dass die specs nur angeben, dass mit
set -a
die variable gekennzeichnet für den export. Das heißt:echo
c
und nicht eine leere Zeile nochb
(set +a
nicht abwählen, für export, noch gibt es "speichern" wird der Wert der Zuweisung nur für die exportierte environment). Dies ist, natürlich, das natürlichste Verhalten.Fazit: mit
set -a
/set +a
weniger langweilig als Export manuell alle Variablen. Es ist überlegen sourcing das zweite Skript, wie es funktionieren wird für jeden Befehl, nicht nur diejenigen geschrieben, die in der gleichen shell-Sprache.InformationsquelleAutor der Antwort gniourf_gniourf
Gibt es eigentlich einen einfacheren Weg, als das exportieren und löschen oder Beschaffung wieder (zumindest in der bash, solange Sie ok sind, wobei die Umgebungsvariablen manuell):
lassen.sh werden
b.sh werden
Beobachtet Ausgang ist
Die Magie liegt in der letzten Zeile der
a.sh
, woMessage
, Sie nur für die Dauer der Inkraftsetzung des./b.sh
, ist der Wert vonsecret
ausa.sh
.Im Grunde, es ist ein wenig wie benannte Parameter/Argumente. Mehr als dass, obwohl, es funktioniert auch für Variablen wie
$DISPLAY
, der steuert, welche X-Server-Anwendung gestartet wird.Denken Sie daran, die Länge der Liste der Umgebungsvariablen ist nicht unendlich. Auf meinem system mit relativ vanilla-kernel
xargs --show-limits
sagt mir die maximale Größe der Argumente, die Puffer 2094486 bytes. Theoretisch bist du mit shell-scripts falsch, wenn Ihre Daten grösser als das (Rohre, anyone?)InformationsquelleAutor der Antwort striking
Hinzufügen, um die Antwort Fataler Fehler, Es gibt eine weitere Methode zum übergeben der Variablen an eine andere shell-Skript.
Der oben vorgeschlagenen Lösung haben einige Nachteile:
using Export
: Es führt dazu, dass die variable vorhanden sein, aus deren Umfang nicht ein gutes design der Praxis.using Source
: Es kann zu Kollisionen mit Namen oder unbeabsichtigtes überschreiben von vordefinierten Variablen auch in einigen anderen shell-Skript-Datei, die Sie bezogen eine andere Datei.Gibt es eine andere einfache Lösung zur Verfügung für uns zu nutzen.
Angesichts der Beispiel die von Ihnen veröffentlicht wurden,
test.sh
test2.sh
Ausgabe
Es ist auch wichtig zu beachten, dass
""
sind notwendig, wenn wir passieren multiword-strings.Unter einem weiteren Beispiel
master.sh
slave1.sh
slave2.sh
Ausgabe
Es geschieht, weil die Gründe treffend beschrieben in dieser link
InformationsquelleAutor der Antwort Subham Tripathi
In Bash, wenn Sie, exportieren Sie die variable in einer subshell, mit Klammern, wie abgebildet, vermeiden Sie leckt die exportierten Variablen:
Der Vorteil hier ist, dass nach dem ausführen des script von der Kommandozeile aus, werden Sie nicht sehen, ein $TESTVARIABLE durchgesickert in Ihrer Umgebung:
InformationsquelleAutor der Antwort Riaz Rizvi
Andere Möglichkeit, die ist ein wenig einfacher für mich ist die Verwendung von named pipes. Named pipes eine Möglichkeit zum synchronisieren und versenden von Nachrichten zwischen verschiedenen Prozessen.
A. bash:
B. bash:
Verwendung:
B. die bash wartet, bis die Nachricht und sobald A. bash sendet die Nachricht, B. bash wird Ihre Arbeit fortsetzen.
InformationsquelleAutor der Antwort Pejman Habashi
Andere option ist die Verwendung
eval
. Dies ist nur geeignet, wenn die Saiten vertraut. Das erste Skript kann echo die variable Zuordnungen:echo "VAR=myvalue"
Dann:
eval $(./first.sh) ./second.sh
Dieser Ansatz ist von besonderem Interesse, wenn das zweite Skript, das Sie wollen, das setzen von Umgebungsvariablen ist nicht in bash und Sie wollen auch nicht
export
den Variablen, vielleicht, weil Sie empfindlich sind und Sie nicht wollen, dass Sie bestehen bleiben.InformationsquelleAutor der Antwort Mark Stosberg