防止bash变量污染环境

时间:2019-03-26 16:02:55

标签: bash

我有一个编译.bashrc文件的脚本。它测试某些命令是否可用。它会生成如下变量:

command -v cheat 2>&1 >/dev/null
HAS_CHEAT=$?

command -v git 2>&1 >/dev/null
HAS_GIT=$?

如果设置了这些变量,脚本中的其他文件将采取或不采取某些措施。

我遇到的问题是,在加载.bashrc之后,我的环境被这些变量污染了。我不想手动unset每个变量。想知道是否有更好的方法。

3 个答案:

答案 0 :(得分:3)

为变量提供一个唯一的前缀(例如上面的“ HAS_”),然后最后运行:

unset "${!HAS_@}"

这种形式的间接扩展(使用!@)提供了一个变量列表,其名称以指定的前缀开头。

注意:除了bash之外,我认为这无法在任何shell中使用。

答案 1 :(得分:2)

您可以将变量封装在函数中,然后将其声明为本地变量:

main() {
  command -v git 2>&1 >/dev/null
  local HAS_GIT=$?
}
main

在您的情况下,您可能根本不需要这些变量。如果您有一个if,则可以编写:

if command -v git 2>&1 >/dev/null; then
  # case in which you have git
else
  # case in which you don't have git
fi

如果您需要在多个位置使用状态代码,我会多次调用同一命令。这可能会慢一些,但是bash的开始速度并不快。另外,我发现if commandif [ "$var" = 0 ]更干净。

has() {
   command -v "$@" 2>&1 >/dev/null
}

if has git; then
  # case in which you have git
fi
# lots of code
if ! has git; then
  # case in which you don't have git
fi

答案 2 :(得分:0)

只需添加另一种可能的处理方式,您就可以使用关联数组,该数组将所有内容保留在一个位置,并防止使用一堆单独的变量乱丢命名空间。

declare -A HAS=()

command -v cheat 2>&1 >/dev/null
HAS[CHEAT]=$?

command -v git 2>&1 >/dev/null
HAS[GIT]=$?

然后在使用完这些值后,您可以unset整个数组:

unset HAS