Warum wird eine Variable außerhalb des Skripts nicht geändert, wenn sie in einem Skript geändert wird?

Warum wird eine Variable außerhalb des Skripts nicht geändert, wenn sie in einem Skript geändert wird?

Nehmen wir an, ich erstelle exporteine Variable über das Terminal. Danach rufe ich ein Skript auf, das diese Variable in etwas anderes ändert. Aber wenn ich zum Terminal und echozur Variable zurückkehre, bleibt sie bei ihrem ursprünglichen Wert.

Was kann ich tun, wenn ich möchte, dass die Variable nicht nur dort, sondern auch außerhalb des Skripts geändert und sichtbar wird?Indas Skript. Hier ist ein Beispiel dessen, was ich sagen möchte:

ares@ares-HP-ProBook-4530s:~$ export package=tree
ares@ares-HP-ProBook-4530s:~$ cat script3.sh 

#! /bin/bash
#set -x
echo $package
apt-cache show $1 | head -1
if [ $? -eq 0 ]; then
    package=1
else
    package=0
fi
echo $package

Ausgabe beim Ausführen des Skripts

ares@ares-HP-ProBook-4530s:~$ ./script3.sh gnome-terminal
tree
Package: gnome-terminal
1
ares@ares-HP-ProBook-4530s:~$ echo $package
tree
ares@ares-HP-ProBook-4530s:~$ 

Antwort1

Ihr Shell-Prozess verfügt über eine Kopie der Umgebung des übergeordneten Prozesses und hat keinerlei Zugriff auf die Umgebung des übergeordneten Prozesses. Wenn Ihr Shell-Prozess beendet wird, gehen alle Änderungen, die Sie an seiner Umgebung vorgenommen haben, verloren. Die am häufigsten verwendete Methode zum Konfigurieren einer Shell-Umgebung ist die Bereitstellung einer Skriptdatei. Vielleicht möchten Sie aber auch einfach in den sauren Apfel beißen und für jede der beiden Shell-Varianten eine eigene Datei pflegen.

Habe diese Antwort gefundenHier

Antwort2

Quelle yourfile.sh

Dies sollte das Nötige bewirken.

Antwort3

Eine andere Möglichkeit besteht darin, eine Funktion in Ihrer .bashrc-Datei zu erstellen und diese Funktion innerhalb der aktuellen Shell aufzurufen. Dadurch sparen Sie ein wenig Tipparbeit. Sie können weiterhin Variablen übergeben.

Dies ist die Methode, die ich anstelle eines Alias ​​verwende, wenn ich etwas mehr Flexibilität benötige.

Antwort4

Neuer Prozess erhaltenKopierenjeder exportierten Variable.

Sie müssen einen der folgenden Schritte ausführen:

  • alle Vorgänge im selben Prozess ausführen (indem das Skript in der aktuellen Shell bereitgestellt wird)
  • Werte an einem gemeinsamen Ort (SQLite, Flatfile) speichern und von jedem Prozess aus lesen/schreiben

verwandte Informationen