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


8

我正在尝试取消匹配的所有环境变量_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。

Answers:


8

那是因为unset它是内置Shell,而不是外部命令。这意味着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 Builtins。我还简化了您的命令,不需要column,您可以为其设置字段分隔符,awk也不需要第二个grep,只需告诉awk打印不匹配的行即可no_proxy

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

1

类似于terdon撰写的答案,但具有sed

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.