如何在采购后停止 .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 的每个未来实现是否都会允许函数在最后一幕中销毁自己。
例如,我的 .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 的每个未来实现是否都会允许函数在最后一幕中销毁自己。