Supprimer toutes les variables ENV correspondant à _PROXY

8

J'essaie de désactiver toutes les variables d'environnement qui correspondent _PROXY:

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

mais ça échoue xargs: unset: No such file or directory.

Si j'essaye de passer unsetà echo, cependant, tout semble fonctionner comme prévu: j'obtiens une liste de variables qui sont définies.

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'est-ce qui semble aller mal? (Si vous avez une autre stratégie pour atteindre l'objectif, je suis intéressé, mais j'aimerais surtout savoir pourquoi cela échoue.)

En outre, j'utilise OS X, au cas où cela serait pertinent.

iconoclaste
la source

Réponses:

8

C'est parce que unsetc'est un shell intégré et non une commande externe. Cela signifie que xargsvous ne pouvez pas l'utiliser car cela n'exécute que les commandes qui se trouvent dans votre $PATH. Vous obtiendriez le même problème si vous essayiez avec 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

Une façon de contourner cela est d'utiliser une boucle shell qui, comme elle fait partie du shell, pourra exécuter les commandes internes du shell. J'ai également simplifié un peu votre commande, il n'y a pas besoin de column, vous pouvez définir le séparateur de champ awket il n'y a pas besoin d'une seconde grep, dites simplement awkà imprimer les lignes qui ne correspondent pas no_proxy:

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

Semblable à la réponse que Terdon a écrite, mais avec sed:

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