取消设置所有与 _PROXY 匹配的 ENV 变量

取消设置所有与 _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

似乎出了什么问题? (如果你有实现目标的替代策略,我很感兴趣,但我会最重要的是想知道为什么会失败。)

另外,我正在使用 OS X,以防相关。

答案1

那是因为unset是一个外壳内置而不是外部命令。这意味着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

解决这个问题的一种方法是使用 shell 循环,因为它是 shell 的一部分,所以能够运行 shell 内置命令。我还稍微简化了您的命令,不需要column,您可以设置字段分隔符awk并且不需要第二个grep,只需告诉awk打印不匹配的行no_proxy

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

答案2

unset `env | grep _PROXY | egrep -o '^[^=]+'`

答案3

与 terdon 写的答案类似,但包含sed

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

相关内容