Desmarque todas as variáveis ​​ENV correspondentes a _PROXY

8

Estou tentando desarmar todas as variáveis ​​de ambiente que correspondem _PROXY:

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

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

Se eu tentar mudar unsetpara echo, no entanto, tudo parece funcionar como esperado: recebo uma lista de variáveis ​​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 atingir a meta, estou interessado, mas acima de tudo, gostaria de saber por que isso está falhando.)

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

iconoclasta
fonte

Respostas:

8

Isso unsetocorre porque um shell está embutido e não um comando externo. Isso significa que xargsnão é possível usá-lo, pois ele executa apenas 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 faz parte do shell, será capaz de executar os buildins do shell. Também simplifiquei um pouco o seu comando, não há necessidade column, você pode definir o separador de campos awke não há necessidade de um segundo grep, basta dizer awkpara 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}')
terdon
fonte
1

Semelhante à resposta que Terdon escreveu, mas com sed:

while read var; do unset $var; done < <(env | grep -i _proxy | sed 's/=.*//g')
user35581
fonte
1
unset `env | grep _PROXY | egrep -o '^[^=]+'`
Roman Rhrn Nesterov
fonte