Сбросить все переменные ENV, соответствующие _PROXY

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.

Однако, если я попытаюсь перейти 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

Что, кажется, идет не так? (Если у вас есть альтернативная стратегия для достижения цели, мне интересно, но мне больше всего хотелось бы знать, почему это не удается.)

Кроме того, я использую OS X, на случай, если это уместно.

иконоборец
источник

Ответы:

8

Это потому , что 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

Одним из способов решения этой проблемы является использование цикла оболочки, который, поскольку он является частью оболочки, сможет запускать встроенные функции оболочки. Я также немного упростил вашу команду, в ней нет необходимости column, вы можете установить разделитель полей awkи нет необходимости в секундах grep, просто попросите awkнапечатать строки, которые не совпадают no_proxy:

while read var; do unset $var; done < <(env | grep -i proxy | 
    awk -F= '!/no_proxy/{print $1}')
Тердон
источник
1

Аналогично ответу, который написал Тердон, но с sed:

while read var; do unset $var; done < <(env | grep -i _proxy | sed 's/=.*//g')
user35581
источник
1
unset `env | grep _PROXY | egrep -o '^[^=]+'`
Роман Ррн Нестеров
источник