Revertir '.' o 'fuente'

Accidentalmente obtuve el entorno incorrecto de un script. ¿Hay alguna manera de 'no tenerlo' o, en otras palabras, de revertirlo y restaurar el entorno anterior?

La respuesta obvia es comenzar desde una session de shell limpia, por supuesto, pero tengo curiosidad de saber si hay otra solución.

Actualización: me refería solo a un script que establece algunas variables.

No, no hay un método general para deshacer los efectos de get un script (o incluso de "meramente" ejecutar uno). Esto es un corolario del hecho de que existen commands irreversibles (por ejemplo, eliminación de files). Si su script contiene un command irreversible, los efectos de la fuente de ese script también serán irreversibles.

¿Hay alguna manera de 'no tenerlo' o, en otras palabras, de revertirlo y restaurar el entorno anterior?

No, no hay una manera automática en general.

Sin embargo, no sabemos qué es lo que has source -ed. Tal vez sea lo suficientemente simple como para ser trivial de deshacer (por ejemplo, algo que simplemente cambie su PATH de una previamente conocida).

Si sabe de antemano que querrá hacer esto, puede hacer el command de source en una subshell y revertir sus efectos (en la medida en que tienen el scope para establecer variables de entorno o shell) al salir de esa subcadena.

Por lo tanto, si ejecuta:

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

… entonces run-command-with-variables tendrá esas variables establecidas, pero run-command-without-variables no lo hará.


También es posible identificar qué funciones de shell se establecieron obteniendo un script verificando los metadatos asociados con esas funciones, de forma que se podría escribir teóricamente una function de shell o script fuente que desactive todas las demás funciones definidas dentro de un file determinado (parametrizado). Para las variables que no funcionan, sin embargo, no hay información almacenada para permitir su desconnection (mucho less para identificar los valores anteriores).