【问题标题】:unsetting a group of environmental variables取消设置一组环境变量
【发布时间】:2014-02-26 09:22:40
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你贴的链接是php的,当然不是你想要的:)

标签: linux shell environment-variables


【解决方案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[@]}

【讨论】:

    【解决方案2】:

    这几乎是对的。您需要做的是将这些命令输出到父 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 命令可以取消设置多个变量的名称。如果出现问题,请使用双引号引用输出:"$(....)"。该链接提供了所有详细信息。

    【讨论】:

      【解决方案3】:

      这似乎有效:

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

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

      我只是没有意识到

      【讨论】:

      • 不,你发布的链接根本不相关:它是针对 php 而问题是针对 shell
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 2021-11-20
      • 2014-07-15
      • 2015-11-16
      • 2022-08-24
      • 2013-09-25
      相关资源
      最近更新 更多