Zurückkehren '.' oder 'Quelle'

7

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.

UVV
quelle
9
Das gibt es nicht. Stellen Sie sich das so vor: Wenn das von Ihnen bezogene Skript enthalten wäre rm -rf /, wie würde das System dies rückgängig machen?
Satō Katsura
Sie erhalten eine hilfreichere Antwort, wenn Sie in Ihrer Frage die Datei mit der falschen Quelle angezeigt haben. Bitte bearbeiten Sie Ihre Frage , um sie zu verbessern.
Basile Starynkevitch
Sie müssen nicht einmal Dateien löschen. Nur das Ändern der Definition einer Shell-Funktion oder des Werts einer Shell-Variablen kann nicht rückgängig gemacht werden, es sei denn, Sie wissen genau, was es vorher war. Aber das kann man im Allgemeinen nicht wissen.
Ilkkachu
1
@ SatōKatsura: Das OP bezieht sich auf die Umgebung , daher denke ich, dass er sich möglicherweise nur mit dem Wert der Umgebungsvariablen befasst. In diesem Fall könnte man die fraglichen Skripte ändern, indem man die anfänglichen Umgebungsvariablen und die Umgebungsvariablen am Ende des Skripts in eine Datei kopiert. Man müsste dann ein kleines Programm schreiben, das die notwendigen Befehle berechnet, um die Änderungen rückgängig zu machen. Ob sich die Mühe lohnt, ist eine andere Frage.
user1934428
1
Selbst wenn Sie sich nur um Umgebungsvariablen kümmern, ist dies nicht trivial. Das Dumping von Variablen, die im aktuellen Skript verwendet werden, reicht nicht aus, da es einen Unterschied zwischen unset foound gibt foo=. 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. :)
Satō Katsura

Antworten:

12

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.

igal
quelle
3

Gibt es eine Möglichkeit, die Quelle zu entfernen oder mit anderen Worten, sie zurückzusetzen und die vorherige Umgebung wiederherzustellen?

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 nur PATHvon einem zuvor bekannten ändert ).

Basile Starynkevitch
quelle
3

Wenn Sie im Voraus wissen, dass Sie dies tun möchten, können Sie den sourceBefehl 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:

(source set-variables; run-command-with-variables); run-command-without-variables

... dann run-command-with-variableswerden diese Variablen gesetzt, aber run-command-without-variablesnicht.


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).

Charles Duffy
quelle