Ich habe versehentlich die falsche Umgebung aus einem Skript bezogen. Gibt es eine Möglichkeit, die Quelle zu entfernen oder mit anderen Worten, sie zurückzusetzen und die vorherige Umgebung wiederherzustellen?
Die offensichtliche Antwort ist natürlich, von einer Clean-Shell-Sitzung zu beginnen, aber ich bin gespannt, ob es eine andere Lösung gibt.
Update: Ich habe mich nur auf ein Skript bezogen, das einige Variablen festlegt.
bash
shell-script
shell
zsh
UVV
quelle
quelle
rm -rf /
, wie würde das System dies rückgängig machen?unset foo
und gibtfoo=
. Dann muss das Skript bezogen und nicht ausgeführt werden, wenn es Auswirkungen auf die aktuelle Umgebung haben soll. Dies bedeutet, dass temporäre Variablen, die vom Skript verwendet werden, wiederhergestellt werden müssen, da alle Effekte rückgängig gemacht werden müssen. Was zu einem interessanten Henne-Ei-Problem führt. :)Antworten:
Nein, es gibt keine allgemeine Methode, um die Auswirkungen der Beschaffung eines Skripts (oder sogar der "bloßen" Ausführung eines Skripts) rückgängig zu machen. Dies ist eine Folge der Tatsache, dass irreversible Befehle vorhanden sind (z. B. Löschen von Dateien). Wenn Ihr Skript einen irreversiblen Befehl enthält, sind die Auswirkungen der Beschaffung dieses Skripts ebenfalls irreversibel.
quelle
Nein, es gibt im Allgemeinen keinen automatischen Weg.
Wir wissen jedoch nicht, was Sie getan haben
source
. Vielleicht ist es einfach genug, um das Rückgängigmachen trivial zu machen (z. B. etwas, das Sie nurPATH
von einem zuvor bekannten ändert ).quelle
Wenn Sie im Voraus wissen, dass Sie dies tun möchten, können Sie den
source
Befehl in einer Subshell ausführen und seine Auswirkungen (sofern sie auf das Festlegen von Shell- oder Umgebungsvariablen beschränkt sind) zurücksetzen, indem Sie diese Subshell beenden.Wenn Sie also Folgendes ausführen:
... dann
run-command-with-variables
werden diese Variablen gesetzt, aberrun-command-without-variables
nicht.Es ist auch möglich zu identifizieren, welche Shell- Funktionen durch Sourcing eines Skripts festgelegt wurden, indem die mit diesen Funktionen verknüpften Metadaten überprüft werden, sodass theoretisch eine Shell-Funktion oder ein Sourcing-Skript geschrieben werden kann, das alle anderen in einer bestimmten (parametrisierten) Datei definierten Funktionen deaktiviert. Für Nichtfunktionsvariablen werden jedoch keine Informationen gespeichert, damit sie nicht gesetzt werden können (geschweige denn frühere Werte identifizieren).
quelle