limpar todas as variáveis ​​sem fechar o terminal

10

Eu quero saber como limpar todas as variáveis ​​que defini no prompt de comando sem fechar o terminal?

por exemplo, se eu definir uma variável no prompt de comando como:

$ a=1

agora eu quero excluir a variável $a(e muitas outras variáveis ​​definidas de maneira semelhante) sem fechar o terminal. Eu poderia usar, unsetmas será agitado se houver grande não. de variáveis

Edward Torvalds
fonte
2
exec "$0"talvez - mas é difícil dizer o que você quer dizer com global .
mikeserv
3
Por que você quer fazer isso?
Hauke ​​Laging
1
@HaukeLaging Estou trabalhando com matrizes usando script. Às vezes, adiciono um elemento a ele. por causa do qual não consigo executar o script com valores antigos (já que a matriz é alterada). Eu tenho que fechar o terminal e iniciar uma nova sessão novamente. Espero ter esclarecido. se não, por favor me avise :) #
Edward Torvalds
1
@muru - ele recebe uma lista salva a uma $varcom var=$(declare -p +F);, em seguida, passa isso como um argumento para uma função que faz echo "${2%%=*}".Essa resposta tem alguns problemas com dimensão - mas deve funcionar se o ambiente não é enorme.
mikeserv
3
Não tenho ideia do que você está tentando fazer. Você está falando de um shell interativo ou de um script? Variáveis ​​definidas em um script executado a partir de um shell interativo não afetam o shell pai. Diga-nos o que você deseja alcançar, não o beco sem saída que você está buscando .
Gilles 'SO- stop be evil'

Respostas:

9

Se você faz (GNU coreutils)

exec env --ignore-environment /bin/bash

você usará um ambiente novo e fresco

Gilles Quenot
fonte
que tal exec "$0"?
Edward Torvalds
@edwardtorvalds $0é o argumento zeroth para um shell executado. Então, se você estiver executando bash $0é bash (provavelmente - que poderia ser -bashem um -lcaso de concha ogin dependendo da versão) . Se você estiver executando um script com um #!/bin/bashbangline, $0é o caminho para o script. exec "$0"provavelmente é mais flexível, mas exec bashé mais explícito. Se você digitar esse comando em um terminal, bashdeverá reconhecê-lo em um ambiente interativo e fazer o equivalente a bash -i- o que também executará seu ~/.bashrcarquivo.
mikeserv
Isso não ajuda export a=123, essa variável é herdada ...
stimur 27/02
1

Você pode usar env, que é fornecido pelo GNU coreutils (normalmente pré-instalado nos sistemas GNU / Linux):

exec env --ignore-environment /bin/bash

A chamada do sistema exec é para que seu processo atual seja substituído no local pela nova versão sem ambiente do seu shell.

Isso tem o benefício de também limpar quaisquer variáveis ​​de ambiente exportadas .

user30747
fonte
Mas isso limparia minha variável PATH modificada, por exemplo export PATH=$PATH:~/foo, certo?
Edward Torvalds
Você está certo. Modifiquei minha resposta para que o caminho absoluto do shell seja usado em vez de $ 0.
user30747
Graças a user30747, sua resposta foi roubada para corrigir a minha. Não é possível excluir a resposta aceita
Gilles Quenot 29/02