防止 bash 变量污染环境



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

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

如果设置了这些变量,脚本中的其他文件将执行或不执行某些操作。

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

给变量一个唯一的前缀(如上面的"HAS_"(,然后在最后运行以下命令:

unset "${!HAS_@}"

这种形式的间接展开(带有!@(给出了一个变量列表,其名称以指定的前缀开头。

注意:我认为这不适用于 bash 以外的任何 shell。

您可以将变量封装在函数中并将它们声明为局部变量:

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

只是为了添加另一种可能的做事方式,你可以使用一个关联数组,它将把所有东西都放在一个地方,并防止用一堆单独的变量乱扔命名空间。

declare -A HAS=()
command -v cheat 2>&1 >/dev/null
HAS[CHEAT]=$?
command -v git 2>&1 >/dev/null
HAS[GIT]=$?

稍后使用这些值后,您可以只unset整个数组:

unset HAS

最新更新