我正在编写一个简单的脚本script.bash
,该脚本应该导出一些变量环境,为了在当前会话中使用它,我必须获取它
$ . script.bash
脚本
function fun1() {
# TODO
}
function fun2() {
# TODO
}
function main_script() {
# ...
# ...
fun1 # calling fun1
# ...
func2 $ 1 $2 # calling fun2
# ...
}
使用script.bash
,调用main_script
函数。
问题:
- 有没有什么办法可以隐藏
fun1
和fun2
,并防止它们被外面调用script.bash
。
答案1
unset -f fun1 fun2
在脚本末尾添加。指定
函数-f
,因为unset
可以取消设置函数和变量。
取消设置手册页入口
答案2
脚本:
unset my_protected_function
function my_protected_function() {
echo "function executed"
}
[ "$0" != "/bin/bash" ] && unset my_protected_function
my_protected_function
直接运行,看不出有什么作用
$ ./test.sh
./test.sh: line 15: my_protected_function: command not found
当你获取它时:
$ source ./test.sh
function executed
这正是您所想的吗?
答案3
您可以通过使用括号(创建子 shell)而不是花括号来实现您想要的效果main_script()
。例如,您的 script.bash 可以像这样重写:
function main_script() (
function fun1() {
# TODO
}
function fun2() {
# TODO
}
# ...
# ...
fun1 # calling fun1
# ...
func2 $ 1 $2 # calling fun2
# ...
)
这样可以防止 fun1() 和 fun2() 在 main_script() 之外被调用,但仍允许 main_script() 被调用。但请注意,您将无法再在 main_script 中设置全局变量。函数执行完毕后,子 shell 及其上下文将消失。
答案4
您可以修改函数名称,然后在需要使用时使用“alias”/“unalias”将其绑定/取消绑定到人类可读的名称。