取消一组环境变量

问题描述 投票:0回答:3

我遇到的情况是,有一些(大约 10 - 30 个)与特定应用程序相关的环境变量。 在重新配置和重新编译应用程序之前,我想删除(即取消设置)所有相关的环境变量。 该列表太烦人,无法明确输入,所以我想要一些自动化。

我看过取消设置变量组,但它似乎不完全是我想要的。

我想出了下面的命令,它显示了我原则上想要做的事情(取消设置名称中带有“G4”的所有环境变量 - 实际上它并不完全完美,如果它的值中也有“G4”,它会取消设置它).

printenv |grep G4 |awk 'BEGIN{FS="=";}{system("unset "$1);}'

正如我所料,这不会影响父 shell,这正是我想要的行为。 我以前遇到过这种情况,在这些情况下我使用了“源”,但我不太明白如何在这里做到这一点。将上述命令放入 shell 脚本中然后对其进行 source 似乎是行不通的。

我知道我可以首先找出设置这些变量的内容,然后将其删除并打开另一个外壳,但我不认为这是一个解决方案(尽管这可能是我在回答这个问题时会做的事情)。我也不想一一取消它们,这很烦人,而且似乎没有必要。

linux shell environment-variables
3个回答
1
投票

这几乎是正确的。您需要做的是将这些命令放入父 shell 中,方法是使用命令替换。首先打印出变量的名称。您的

awk
命令是实现此目的的一种方法:

printenv |grep G4 |awk 'BEGIN{FS="=";}{print $1;}'

然后使用命令替换将输出提供给 shell:

unset $(printenv |grep G4 |awk 'BEGIN{FS="=";}{print $1;}')

$(...)
将命令的输出提供给 shell,就像您键入它一样。我说“几乎”是因为 shell 稍微处理了输出,例如删除换行符。在这种情况下,这很好,因为
unset
命令可以获取多个要取消设置的变量的名称。如果出现问题,请使用双引号引用输出:
"$(....)"
。该链接提供了所有详细信息。


1
投票

这似乎有效:

unset `printenv |grep G4 |awk 'BEGIN{FS="=";}{printf("%s ",$1);}'`

我想这与以下问题的答案有关:未设置变量组

我只是没有意识到


-1
投票
declare -a vars_to_unset=(blue green red)
unset ${vars_to_unset[@]}

将立即取消设置

$blue
$green
$red

扩展到包含

G4
的变量:

declare -a arr=($(env | cut -d= -f1 | grep G4))
unset ${arr[@]}
© www.soinside.com 2019 - 2024. All rights reserved.