Desarme todas las variables ENV que coincidan con _PROXY

8

Estoy tratando de desarmar todas las variables de entorno que coinciden _PROXY:

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

pero está fallando con xargs: unset: No such file or directory.

Sin embargo, si trato de cambiar unseta echo, todo parece funcionar como se esperaba: obtengo una lista de variables configuradas.

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

¿Qué parece estar yendo mal? (Si usted tiene una estrategia alternativa para lograr el objetivo, estoy interesado, pero me gustaría más que nada como saber por qué esto está fallando.)

Además, estoy usando OS X, en caso de que sea relevante.

iconoclasta
fuente

Respuestas:

8

Eso es porque unsetes un shell incorporado y no un comando externo. Esto significa que xargsno puede usarlo ya que solo ejecuta comandos que están en su $PATH. Tendría el mismo problema si intentara con 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

Una forma de evitar esto es usar un bucle de shell que, dado que es parte del shell, podrá ejecutar shell builtins. También simplifiqué un poco su comando, no es necesario column, puede configurar el separador de campo awky no hay necesidad de un segundo grep, solo dígale awkque imprima líneas que no coinciden no_proxy:

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

Similar a la respuesta que escribió terdon, pero con sed:

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