Portanto, preciso evitar que muitas variáveis exportadas sejam reconhecidas por um shell filho.
O problema é que um aplicativo (Wine + UDK) não cria projetos com muitos (> 65535) bytes no ambiente, e o meu tem muitos (95323) depois de usar um projeto (ScriptEchoColor) que compartilha variáveis de ambiente entre qualquer bash cartuchos.
Não consigo encontrar um comando que me permita gerar um shell filho que não aceite variáveis de ambiente atuais e, em vez disso, use apenas aquelas definidas em meu perfil de usuário e no sistema como um todo.
Eu tentei muitas opções mostradas em bash --help
.
Responder1
Você pode usar o env
comando para iniciar um processo com um ambiente limpo. Aqui está um exemplo:
env -i /bin/myprog
Caso ainda precise exportar algumas variáveis, você pode fazer isso na chamada:
env -i MYVAR=foo /bin/myprog
O comando env é exigido porPOSIX.
Responder2
env -i somecommand
é executado somecommand
em um ambiente vazio. Você pode colocar argumentos depois somecommand
. Se PATH
estiver apagado, você precisará especificar o caminho completo para o arquivo somecommand
. Alternativamente, você pode preservar PATH
ou definir um valor diferente.
env -i PATH="$PATH:/another/directory" somecommand
Se você deseja ter o mesmo ambiente que teria após o login, preserve apenas algumas variáveis e carregue-as .profile
para definir o restante. Se você usar um shell de login diferente (bash with .bash_profile
, csh with .login
, etc.), adapte-o adequadamente.
env -i HOME="$HOME" PATH=/usr/local/bin:/usr/bin:/bin USER="$USER" \
sh -c '. ~/.profile; "$@"' _ somecommand
Alternativamente, você pode preferir remover algumas variáveis do ambiente. env -u VAR1 -u VAR2 somecommand
remove VAR1
e VAR2
do ambiente e executa somecommand
. No Linux, você pode usar env -0 | tr '\n\0' '.\n' | sed 's/=.*//'
para produzir uma lista de variáveis de ambiente com um nome por linha, adequado para filtragem. Em outras variantes Unix, env | sed 's/=.*//'
faz o mesmo trabalho, com a limitação de poder encontrar falsos positivos se os valores de algumas variáveis contiverem novas linhas.
Responder3
Emissão typeset +x variable_name...
ou declare +x variable_name...
comando. Você pode até usar expressões regulares para nomes de variáveis, como typeset +x ${!MY_VAR_*}
.