web-dev-qa-db-ja.com

_PROXYに一致するすべてのENV変数の設定を解除します

_PROXYに一致するすべての環境変数を設定解除しようとしています:

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

しかし、それはxargs: unset: No such file or directoryで失敗しています。

unsetechoに変更しようとすると、すべてが期待どおりに機能するように見えます。設定されている変数のリストが表示されます。

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

何がうまくいかないようですか? (目標を達成するための別の戦略がある場合、私は興味がありますが、私は何よりもこれが失敗する理由を知りたいと思います。)

また、必要に応じて、OSXを使用しています。

8
iconoclast

これは、unsetShell builtin であり、外部コマンドではないためです。これは、xargsは、$PATHにあるコマンドのみを実行するため使用できないことを意味します。 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

これを回避する1つの方法は、シェルループを使用することです。これは、シェルの一部であるため、シェルビルトインを実行できます。また、コマンドを少し簡略化しました。columnは必要ありません。また、フィールドセパレータをawkに設定でき、2番目のgrepも必要ありません。awkno_proxyと一致しない行を印刷するには:

while read var; do unset $var; done < <(env | grep -i proxy | 
    awk -F= '!/no_proxy/{print $1}')
8
terdon
unset `env | grep _PROXY | egrep -o '^[^=]+'`
1

Terdonが書いた答えに似ていますが、sedが付いています。

while read var; do unset $var; done < <(env | grep -i _proxy | sed 's/=.*//g')
1
user35581