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

joz*_*yqk 4 bash scope

作为一个实例,我.bashrc使用以下方式的相对路径,虽然我的问题是关于使用的任何临时变量源其他脚本.bashrc.

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

现在我把DIR每一个壳弄得乱七八糟.没有明确unset DIR的结尾.bashrc,有没有办法限制变量的范围?

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

Han*_*der 8

我非常感谢你提出这个问题.我讨厌不再使用的变量,但仍然使shell混乱.有些人构建了大型bash脚本,这些脚本执行复杂的操作,并且他们不关心这些变量,最后有数百个未使用的变量使shell的命名空间变得混乱,而且完全不清楚哪些仍然需要它们以及哪些不是.

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

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

source_it
Run Code Online (Sandbox Code Playgroud)

变量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
Run Code Online (Sandbox Code Playgroud)

回答你的第一条评论:你甚至可以写一个自我毁灭的功能.试试这个:

#!/bin/bash

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

fun
fun
Run Code Online (Sandbox Code Playgroud)

结果:

this is fun
(script name): line 10: fun: command not found
Run Code Online (Sandbox Code Playgroud)

然而,这看起来有点奇怪 - 我不确定bash的每一个未来实现是否会允许函数将自己作为最后一个行为进行破坏.