Thursday, April 7, 2022

[SOLVED] How to use unset with xargs in shell script?

Issue

ITNOA

I want to write bash script, to remove some environmental variable

my problem is when I run below command

env | grep -i _proxy= | cut -d "=" -f1 | xargs -I {} echo {}

I see below result

HTTPS_PROXY
HTTP_PROXY
ALL_PROXY

but when I replace echo with unset, something like below

env | grep -i _proxy= | cut -d "=" -f1 | xargs -I {} unset {}

I see below error

xargs: unset: No such file or directory

What is my problem? If I use xargs incorrectly?


Solution

You have xargs running in a pipeline. Therefore it is running in a separate process, and it cannot alter the environment of the "parent" shell.

Also, xargs works with commands, not shell builtins.

You'll need to do this:

while read -r varname; do unset "$varname"; done < <(
    env | grep -i _proxy= | cut -d "=" -f1
)

or

mapfile -t varnames  < <(env | grep -i _proxy= | cut -d "=" -f1)
unset "${varnames[@]}"


Answered By - glenn jackman
Answer Checked By - Timothy Miller (WPSolving Admin)