【问题标题】:How to use unset with xargs in shell script?如何在 shell 脚本中使用 unset 和 xargs?
【发布时间】:2021-12-09 04:17:02
【问题描述】:

ITNOA

我想写bash脚本,去掉一些环境变量

我的问题是当我在命令下运行时

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

我看到下面的结果

HTTPS_PROXY
HTTP_PROXY
ALL_PROXY

但是当我将echo 替换为unset 时,如下所示

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

我看到下面的错误

xargs: unset: No such file or directory

我的问题是什么?如果我错误地使用了xargs

【问题讨论】:

  • unset 只能更改运行它的 shell(此外,它是一个内置的 shell,shell 的一部分,而不是外部命令)。 xargs 不是内置的外壳程序,因此它本身和它运行的任何东西都是与该外壳程序分开的进程(这意味着它根本无法运行外壳程序内置程序,除非它启动一个外壳程序来运行它们......如果它这样做,新的 shell 与启动 xargs 的 shell 不同,并且无法修改原始/父 shell 的状态)。

标签: bash shell xargs


【解决方案1】:

您有 xargs 在管道中运行。因此它在一个单独的进程中运行,它不能改变“父”shell的环境。

此外,xargs 可用于命令,而不是 shell 内置。

您需要这样做:

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

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

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 2021-08-01
    • 1970-01-01
    • 2011-03-20
    • 2013-12-22
    • 2019-11-21
    • 2012-11-14
    • 2016-04-20
    相关资源
    最近更新 更多