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

3

Com o propósito de um experimento ...

Suponha que eu fiz isso

bash="unset DISPLAY; export DISPLAY"

para que eu possa tornar DISPLAY undefined. Como posso restaurar o conjunto de valores original? Ou pelo menos saber o que era?

    
por CppLearner 13.06.2012 / 23:12

3 respostas

5

Em geral, você escreve antes da mão.

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

Se você está perguntando sobre isso porque agora você está ferrado e está esperando que haja algo que vai te salvar, então eu tenho uma má notícia para você ...

    
por 14.06.2012 / 00:10
3

Não sei se há uma maneira fácil de fazer isso (como cd - para alternar entre os comandos cd mais recentes, por exemplo)

Qual é o contexto de se fazer isso ... você quer que isso esteja disponível automaticamente? Eu não estou ciente disso como uma característica de qualquer 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

Atribuir um novo valor:

$ VENDOR='Zippy'
$ echo $VENDOR
Zippy

Restaure o valor original:

$ VENDOR=$pre_VENDOR
$ echo $VENDOR
intel
    
por 13.06.2012 / 23:20
1

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

old_DISPLAY=$DISPLAY
unset DISPLAY
…
DISPLAY=$old_DISPLAY

Se você deseja 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 COMMAND para definir a variável de ambiente VAR para o valor especificado apenas para esse comando.

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

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

Você também pode manter as alterações locais em um subshell. Parênteses delimitam comandos para executar em uma subcamada.

$ 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 exit ou Ctrl + D para 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
    
por 14.06.2012 / 03:59