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

Я пытаюсь отключить все переменные среды, которые соответствуют _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, если это имеет значение.

  • Скопируйте файлы с родительской папкой в ​​новый каталог
  • Как удалить все, кроме последних 10 файлов
  • Как скопировать список файлов и настроить имена файлов назначения на лету?
  • человек xargs говорит, что стандартный ввод ограничивается пробелами; но так ли?
  • команды трубопроводов после трубопровода xargs
  • Предложение xargs grep
  • Что такое replstrs как {}?
  • удалять файлы после вставки в tarball
  • One Solution collect form web for “Отменить все переменные ENV, соответствующие _PROXY”

    Это потому, что 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}') 
    Linux и Unix - лучшая ОС в мире.