取消一组环境变量

时间:2014-02-03 00:21:10

标签: linux shell environment-variables

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

我看过Unset group of variables,但似乎不是我想要的。

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

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

正如我所料,这不会影响父shell,这是我想要的行为。我之前遇到过这种情况,在那些情况下我使用过'source',但我不知道怎么做到这里。它似乎无法将上述命令放在shell脚本中然后获取源代码。

我知道我可以找出首先设置这些变量的内容并删除它并打开另一个shell但是我不认为这是一个解决方案(虽然这可能是我在回答这个问题时会做的) 。我也不想一个一个地取消它们,这很烦人,似乎不应该这样。

3 个答案:

答案 0 :(得分:1)

这似乎有效:

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

我想这与答案有关:Unset group of variables

我只是没有意识到它

答案 1 :(得分:1)

这几乎是正确的。您需要做的是将这些命令输出到父shell中,并且使用command substitution的方法。首先打印出变量的名称。您的awk命令是一种方法:

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

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

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

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

答案 2 :(得分:-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[@]}