Como posso restaurar as alterações na variável shell?

Como posso restaurar as alterações na variável shell?

Com o propósito de um experimento...

Suponha que eu fiz isso

bash="unset DISPLAY; export DISPLAY"

para que eu possa tornar DISPLAYindefinido. Como posso restaurar o conjunto de valores original? Ou pelo menos sabe o que era?

Responder1

Em geral você anota com antecedência.

Se você está perguntando sobre isso em teoria, simplesmente armazene o valor antigo em outro lugar antes de modificá-lo e coloque-o de volta quando quiser.

Se você está perguntando sobre isso porque agora está ferrado e espera que haja algo que irá salvá-lo, então tenho más notícias para você...

Responder2

Não tenho certeza se existe uma maneira fácil de fazer isso (como cd -alternar entre cdos comandos mais recentes, por exemplo)

Qual é o contexto para fazer isso. Você deseja que isso esteja disponível automaticamente? Não estou ciente disso como um recurso de nenhum shell.

Uma solução óbvia seria salvar explicitamente a variável antes de alterá-la e depois restaurá-la. Usando a variável de ambiente VENDOR como exemplo:

$ echo $VENDOR
intel

Salve o valor original:

$ pre_VENDOR=$VENDOR
$ echo $pre_VENDOR
intel

Atribua um novo valor:

$ VENDOR='Zippy'
$ echo $VENDOR
Zippy

Restaure o valor original:

$ VENDOR=$pre_VENDOR
$ echo $VENDOR
intel

Responder3

Você não pode, não há como desfazer. Salve o valor em outra variável (ou em um arquivo ou onde quiser) se quiser disponibilizá-lo posteriormente.

old_DISPLAY=$DISPLAY
unset DISPLAY
DISPLAY=$old_DISPLAY

Se você quiser executar um único comando sem a variável de ambiente, use env.

env -u DISPLAY emacs

Você também pode usar a sintaxe VAR=VALUE COMMANDpara definir a variável de ambiente VARcom o valor especificado apenas para este comando.

$ echo $DISPLAY
:0
$ DISPLAY=:1 xterm & # shows the xterm window on display :1
$ echo $DISPLAY
:0

Você não pode cancelar a definição de uma variável dessa maneira, mas pode configurá-la para um valor vazio, o que geralmente é bom o suficiente.

Você também pode manter as alterações locais em um subshell. Os parênteses delimitam os comandos a serem executados em um subshell.

$ env | grep -E 'FOO|BAR'
FOO=value_of_FOO
BAR=value_of_BAR
$ (export FOO=other_value; unset BAR; env | grep -E 'FOO|BAR')
FOO=other_value
$ env | grep -E 'FOO|BAR'
FOO=value_of_FOO
BAR=value_of_BAR

Você pode executar um shell separado com um ambiente diferente. Digite exitou Ctrl+ Dpara retornar ao shell pai.

$ bash
$ # change the environment, change directories, etc.
$ exit
$ # now you're back to the parent shell with its environment as you left it

informação relacionada