如何在执行完.bashrc文件后停止在Shell中看到变量?

5
作为一个例子,我的.bashrc通过以下方式使用相对路径来源其他脚本,尽管我的问题是关于在.bashrc中使用任何临时变量的。 DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
source $DIR/.somefile 现在我在每个shell中都有DIR。除了在.bashrc末尾显式地unset DIR,还有没有限制变量范围的方法?
[编辑] 查看列表:( set -o posix ; set ) | less
1个回答

9
我很感谢你提出这个问题。我不喜欢那些不再使用但仍然混乱shell的变量。有些人编写了大型的bash脚本,执行复杂的操作,他们不关心这些变量,在最后会有数百个未使用的变量混乱了shell的命名空间,而且完全不清楚哪些变量仍然需要,哪些不需要。
通用解决方案是在函数内部使用本地变量:
function source_it()
{
  local DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
  source $DIR/.somefile
}

source_it

变量DIR将在函数内部可见,并在由该函数调用的所有函数中可见。一旦从函数返回,它将停止存在。

即使您已经有一个名为DIR的全局变量,这也将起作用。局部变量将掩盖全局变量DIR,因此函数仅使用局部版本,一旦函数返回,全局版本的DIR将再次可见,完全不受影响。

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

#!/bin/bash

factorial()
{
   local n="$1"
   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实现都会允许函数在其最后一步销毁自己。


1
更加清晰。谢谢 :). 函数 source_it 仍将被定义,但这比成百上千个小变量挂在那里要好得多。我总是可以使用 unset -f source_it,这只是一件事情。 - jozxyqk
刚刚添加了一个可能的解决方案 - 但我不知道这是否保证永远有效。不过目前运行良好。 - Hans Klünder
哦,不错。在函数内部的任何地方也可以使用 unset -f $FUNCNAME - jozxyqk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接