有没有什么办法可以封装bash函数?

有没有什么办法可以封装bash函数?

我正在编写一个简单的脚本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函数。

问题

  • 有没有什么办法可以隐藏fun1fun2,并防止它们被外面调用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”将其绑定/取消绑定到人类可读的名称。

相关内容