如何在采购后停止 .bashrc 中的变量在 shell 中可见?

How do I stop variables in .bashrc being visible in the shell after sourcing?

例如,我的 .bashrc 通过以下方式使用相对路径获取其他脚本,尽管我的问题是关于 .bashrc.

中使用的任何临时变量

DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source $DIR/.somefile

现在我每 shell 就有 DIR 混乱。在 .bashrc 末尾没有显式 unset DIR,有没有办法限制变量的范围?

[编辑] 查看列表:( set -o posix ; set ) | less

非常感谢您提出这个问题。我讨厌不再使用但仍然使 shell 混乱的变量。有些人构建大型 bash 脚本来做复杂的事情,他们不关心这些变量,最后有数百个未使用的变量使 shell 的命名空间混乱,并且完全不清楚其中哪些还需要,哪些不需要。

一般的解决方法是在函数内部使用局部变量:

function source_it()
{
  local DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
  source $DIR/.somefile
}

source_it

变量 DIR 将在函数内以及函数调用的所有函数中可见。它将在函数 return 后不复存在。

即使您已经有一个名为 DIR 的全局变量,它也能正常工作。局部变量会遮蔽全局变量 DIR,因此函数只使用局部版本,一旦函数 returns,全局版本的 DIR 将再次可见,完全保持不变。

嵌套函数调用可以创建任意多个版本的局部变量:

#!/bin/bash

factorial()
{
   local n=""
   if test $n -eq 0
   then
      echo 1
   else
      local m=$((n-1))
      echo $((n*$(factorial $m)))
   fi
}

factorial 5  # result: 120

回答您的第一个评论:您甚至可以编写一个自毁函数。试试这个:

#!/bin/bash

fun()
{
   echo this is fun
   # unset -f fun # upon your 2nd comment, changed that to:
   unset -f $FUNCNAME 
}

fun
fun

结果:

this is fun
(script name): line 10: fun: command not found

但是,这看起来有点奇怪 - 我不确定 bash 的每个未来实现是否都会允许函数在最后一幕中销毁自己。