Desativa todas as variáveis ENV correspondentes a _PROXY

6

Estou tentando cancelar a configuração de todas as variáveis de ambiente que correspondem a _PROXY :

env | grep -i _proxy | column -t -s '=' | awk '{ print $1 }' | grep -iv 'no_proxy' | xargs -0 -I variable unset variable

mas está falhando com xargs: unset: No such file or directory .

Se eu tentar alterar unset para echo , no entanto, tudo parece funcionar como esperado: Eu recebo uma lista de variáveis que estão definidas.

env | grep -i _proxy | column -t -s '=' | awk '{ print $1 }' | grep -iv 'no_proxy' | xargs -0 -I variable echo variable
http_proxy
ftp_proxy
FTP_PROXY
https_proxy
HTTPS_PROXY
HTTP_PROXY

O que parece estar errado? (Se você tem uma estratégia alternativa para realizar o objetivo, estou interessado, mas gostaria acima de tudo de saber por que isso está falhando.)

Além disso, estou usando o OS X, caso isso seja relevante.

    
por iconoclast 16.06.2015 / 00:58

1 resposta

7

Isso porque unset é um shell embutido e não um comando externo. Isso significa que xargs não pode usá-lo, uma vez que apenas executa comandos que estão no seu $PATH . Você teria o mesmo problema se tentasse com cd :

$ ls -l
total 4
drwxr-xr-x 2 terdon terdon 4096 Jun 16 02:02 foo
$ echo foo | xargs cd
xargs: cd: No such file or directory

Uma maneira de contornar isso é usar um loop de shell que, como parte do shell, será capaz de executar builtins de shell. Eu também simplifiquei um pouco o seu comando, não há necessidade de column , você pode definir o separador de campo para awk e não há necessidade de um segundo grep , apenas diga awk para imprimir linhas que não correspondem no_proxy :

while read var; do unset $var; done < <(env | grep -i proxy | 
    awk -F= '!/no_proxy/{print $1}')
    
por 16.06.2015 / 01:07