Oposto ao comando 'source'

7

Eu uso o comando source no meu script bash para ler / imprimir os valores das variáveis

more linuxmachines_mount_point.txt

export linuxmachine01="sdb sdc sdf sdd sde sdg"
export linuxmachine02="sde sdd sdb sdf sdc"
export linuxmachine03="sdb sdd sdc sde sdf"
export linuxmachine06="sdb sde sdf sdd"

source  linuxmachines_mount_point.txt

echo $linuxmachine01
sdb sdc sdf sdd sde sdg

Qual é o oposto de source para desfazer as variáveis?

Resultados esperados

echo $linuxmachine01

< no output >
    
por yael 30.12.2017 / 20:31

7 respostas

19

Usando um subshell (recomendado)

Execute o comando de origem em um subshell:

(
source linuxmachines_mount_point.txt
cmd1 $linuxmachine02
other_commands_using_variables
etc
)
echo $linuxmachine01  # Will return nothing

Subshells são definidos por parens: (...) . Quaisquer variáveis shell configuradas dentro da subshell são esquecidas quando a subshell termina.

Usando unset

Isso anula qualquer variável exportada por linuxmachines_mount_point.txt :

unset $(awk -F'[ =]+' '/^export/{print $2}' linuxmachines_mount_point.txt)
  • -F'[ =]+' diz ao awk para usar qualquer combinação de espaços e sinais de igual como o separador de campos.

  • /^export/{print $2}

    Isto diz ao awk para selecionar linhas que começam com export e depois imprimem o segundo campo.

  • unset $(...)

    Isso executa o comando dentro de $(...) , captura seu stdout e desconfigura quaisquer variáveis nomeadas por sua saída.

por 30.12.2017 / 21:17
4

Você não pode remover o source do script.

O que você pode fazer é armazenar todas as variáveis exportadas em um arquivo temporário, compará-las a variáveis após a origem do script e, em seguida, remover o estouro com unset , por exemplo:

export > temp_file
source myscript

#... do some stuff

unset "$(comm -3 <(sort temp_file) <(export | sort) | awk -F'[ =]' '{print $3}' | tr '\n' ' ')"
    
por 30.12.2017 / 21:21
2

Você pode usar o comando unset para "esquecer" variáveis.

    
por 30.12.2017 / 20:32
2

A solução mais simples para ter a saída que você espera (nada) é declarar novamente a variável como vazia:

$ export linuxmachine01="sdb sdc sdf sdd sde sdg"
$ echo "$linuxmachine01"
sdb sdc sdf sdd sde sdg

$ linuxmachine01=""
$ echo "$linuxmachine01"
$

É claro que a variável ainda está definida (e exportada), vazia, mas definida:

$ declare -p linuxmachine01
declare -x linuxmachine01=""

Para remover corretamente a variável do ambiente e do shell em execução, você deve usar unset (a maneira recomendada):

$ unset linuxmachine01
$ declare -p linuxmachine01
bash: declare: linuxmachine01: not found
$ echo "$linuxmachine01"
$
    
por 30.12.2017 / 21:38
1

A maneira mais simples de fazer isso é modificar seu script para que ele também defina um comando para desfazer o efeito do script:

export linuxmachine01="sdb sdc sdf sdd sde sdg"
export linuxmachine02="sde sdd sdb sdf sdc"
export linuxmachine03="sdb sdd sdc sde sdf"
export linuxmachine06="sdb sde sdf sdd"
alias linuxmachines_mount_point='for v in linuxmachine01 linuxmachine02 linuxmachine03 linuxmachine04; do unset $v; done; unalias linuxmachines_mount_point'
    
por 31.12.2017 / 19:51
0

Você pode escrever seu linuxmachines_mount_point.txt assim

test "$linuxmachine01" && unset -v linuxmachine01 || linuxmachine01="sdb sdc sdf sdd sde sdg"

Quando você precisa de suas variáveis

source linuxmachines_mount_point.txt

Quando você deseja remover as variáveis

source linuxmachines_mount_point.txt
    
por 01.01.2018 / 02:05
0

Se você estiver usando o comando source para ativar um VirtualEnvironment , poderá sair usando o comando deactivate .

    
por 24.09.2018 / 20:20