ico*_*ast 11 grep xargs awk environment-variables
我正在尝试取消设置匹配的所有环境变量_PROXY
:
env | grep -i _proxy | column -t -s '=' | awk '{ print $1 }' | grep -iv 'no_proxy' | xargs -0 -I variable unset variable
Run Code Online (Sandbox Code Playgroud)
但它失败了xargs: unset: No such file or directory
。
但是,如果我尝试更改unset
为echo
,一切似乎都按预期工作:我得到一个已设置的变量列表。
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
Run Code Online (Sandbox Code Playgroud)
似乎出了什么问题?(如果您有实现目标的替代策略,我很感兴趣,但我最想知道为什么会失败。)
另外,我正在使用 OS X,以防万一。
那是因为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
Run Code Online (Sandbox Code Playgroud)
解决此问题的一种方法是使用 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}')
Run Code Online (Sandbox Code Playgroud)