我遇到的情况是,有一些(大约 10 - 30 个)与特定应用程序相关的环境变量。 在重新配置和重新编译应用程序之前,我想删除(即取消设置)所有相关的环境变量。 该列表太烦人,无法明确输入,所以我想要一些自动化。
我看过取消设置变量组,但它似乎不完全是我想要的。
我想出了下面的命令,它显示了我原则上想要做的事情(取消设置名称中带有“G4”的所有环境变量 - 实际上它并不完全完美,如果它的值中也有“G4”,它会取消设置它).
printenv |grep G4 |awk 'BEGIN{FS="=";}{system("unset "$1);}'
正如我所料,这不会影响父 shell,这正是我想要的行为。 我以前遇到过这种情况,在这些情况下我使用了“源”,但我不太明白如何在这里做到这一点。将上述命令放入 shell 脚本中然后对其进行 source 似乎是行不通的。
我知道我可以首先找出设置这些变量的内容,然后将其删除并打开另一个外壳,但我不认为这是一个解决方案(尽管这可能是我在回答这个问题时会做的事情)。我也不想一一取消它们,这很烦人,而且似乎没有必要。
这几乎是正确的。您需要做的是将这些命令放入父 shell 中,方法是使用命令替换。首先打印出变量的名称。您的
awk
命令是实现此目的的一种方法:
printenv |grep G4 |awk 'BEGIN{FS="=";}{print $1;}'
然后使用命令替换将输出提供给 shell:
unset $(printenv |grep G4 |awk 'BEGIN{FS="=";}{print $1;}')
$(...)
将命令的输出提供给 shell,就像您键入它一样。我说“几乎”是因为 shell 稍微处理了输出,例如删除换行符。在这种情况下,这很好,因为 unset
命令可以获取多个要取消设置的变量的名称。如果出现问题,请使用双引号引用输出:"$(....)"
。该链接提供了所有详细信息。
这似乎有效:
unset `printenv |grep G4 |awk 'BEGIN{FS="=";}{printf("%s ",$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[@]}