Awk

取消設置所有匹配 _PROXY 的 ENV 變數

  • March 18, 2020

我正在嘗試取消設置所有匹配的環境變數_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,以防萬一。

那是因為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 內置程序。我還稍微簡化了你的命令,不需要column,你可以設置欄位分隔符,awk不需要第二個grep,只需告訴awk列印不匹配的行no_proxy

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

引用自:https://unix.stackexchange.com/questions/209895