我的情况是,有一些~10 - 30个与特定应用有关的环境变量。在重新配置和重新编译应用程序之前,我想删除(即取消设置)所有相关的环境变量。这个列表太烦人了,无法明确输出,所以我想要一些自动化。
我看过Unset group of variables,但似乎不是我想要的。
我想出了下面的命令,它显示了我原则上要做的事情(在名称中用“G4”取消设置所有环境变量 - 实际上它并不完美,如果它有“G4”,它将取消设置价值观也是如此)。
printenv |grep G4 |awk 'BEGIN{FS="=";}{system("unset "$1);}'
正如我所料,这不会影响父shell,这是我想要的行为。我之前遇到过这种情况,在那些情况下我使用过'source',但我不知道怎么做到这里。它似乎无法将上述命令放在shell脚本中然后获取源代码。
我知道我可以找出首先设置这些变量的内容并删除它并打开另一个shell但是我不认为这是一个解决方案(虽然这可能是我在回答这个问题时会做的) 。我也不想一个一个地取消它们,这很烦人,似乎不应该这样。
答案 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[@]}