não pode desanexar variáveis env do script

2

Estou tentando desfazer todas as variáveis de ambiente de dentro de um script. O script é executado corretamente, mas se eu executar o comando, ele ainda mostrará todas as variáveis definidas.
Se eu executar o comando da CLI, ele funciona e as variáveis não estão definidas.

unset 'env | awk -F= '/^\w/ {print $1}' | xargs'

Tem alguma ideia de como executar isso a partir de um script?
Além disso, tem alguma idéia de como fonte / etc / profile de um script? Isso não funciona também.

Eu preciso definir variáveis com os mesmos nomes, mas caminhos diferentes, dependendo das instâncias que meus usuários precisam.

Mais tarde editar:
ok, acabei com essa solução (não muito elegante, mas seja qual for):

. script 

que contém:

unset 'env | awk -F= '/^\w/ {print $1}'|egrep -v "HOSTNAME|TERM|SHELL|HISTSIZE|SSH_CLIENT|SSH_TTY|USER|LS_COLORS|KDEDIR|MAIL|PATH|INPUTRC|PWD|LANG|HISTIGNORE|SSH_ASKPASS|TEST|SHLVL|HOME|LD_ASSUME_KERNEL|LOGNAME|SSH_CONNECTION|LESSOPEN|HISTTIMEFORMAT|G_BROKEN_FILENAMES|_"|xargs'
source env_variable_file

Obrigado!

    
por w00t 29.12.2010 / 15:19

3 respostas

7

Esta é uma resposta padrão, basicamente. Você não pode fazer isso, porque o script é executado em um novo processo filho. Esse processo obtém seu próprio ambiente e não pode alterar o pai, seja para definir variáveis ou para desfazê-las.

Você pode executar o script no ambiente atual usando o comando . . E você pode pesquisar / etc / profile da mesma maneira:

. /etc/profile

    
por 29.12.2010 / 15:35
2

Eu tentei executar seu script e isso não funciona para mim.

Eu pesquisei um pouco e achei isso:

unset $(/usr/bin/env | egrep '^(\w+)=(.*)$' | \
egrep -vw 'PWD|USER|LANG' | /usr/bin/cut -d= -f1);

Este realmente funciona; -)

Para arquivos de sourcing

source /etc/profile

é o caminho certo como você disse.

Se eu modificar seu script assim

unset $(env | awk -F= '{print $1}' | xargs)

também funciona.

Eu não acho que, se houver alguma diferença, execute o comando interativamente vs de um script.

    
por 29.12.2010 / 15:45
0

Use -v para o comando unset para extrair itens do ambiente; observe no final deste script de teste como você pode obter erros porque não definimos $ PATH para que ele não encontre programas como 'id' e tal.

#!/bin/sh

LIST='env | awk -F= '/^\w/ {print $1}' | xargs'

for item in $LIST; do
  echo "$item = ${!item}";
done

unset -v $LIST

for item in $LIST; do
  echo "$item = ${!item}";
done

HISTSIZE=5555
echo $HISTSIZE
source /etc/profile
echo $HISTSIZE
    
por 29.12.2010 / 15:59