在 Bash 脚本中调用源文件的函数

在 Bash 脚本中调用源文件的函数

我有一个 bash 文件,src-useful.bash包含有用的功能,例如say_hello(),位于 /path/to/useful。

在我的里面~/.bash_profile我添加了以下几行:

export BASH_USEFUL=/path/to/useful
source $BASH_USEFUL/src-useful.bash

打开一个新终端我可以检查以下内容:

$ echo $BASH_USEFUL
/path/to/useful

$ cat $BASH_USEFUL/src-useful.bash
function hello() {
    echo "hello!"
}

$ hello
hello!

我创建了一个脚本say_hello.sh

$ cat say_hello.sh
echo "BASH_USEFUL: $BASH_USEFUL"
hello

$ ./say_hello.sh
BASH_USEFUL: /path/to/useful  # Recognizsed
say_hello.sh: line 2: say_hello: command not found  # Not recognized?

但是如果我输入$BASH_USEFUL/src-useful.bashsay_hello.sh就会起作用:

$ cat say_hello.sh
echo "BASH_USEFUL: $BASH_USEFUL"
source $BASH_USEFUL/src-useful
say_hello

$ ./say_hello.sh
BASH_USEFUL: /path/to/useful  # Recognized
hello!  # Function say_hello is now recognized

我想知道为什么BASH_USEFUL我的脚本仍能识别变量,而我源文件中的函数却无法在正在运行的脚本的环境中看到。除了src-useful.bash在脚本中获取我的源文件外,还有其他解决方法吗?我希望src-useful.bash在我启动的任何脚本的环境中加载 的函数。

答案1

只有导出的环境项才会复制到新的子环境中。您已导出,BASH_USEFUL因此此环境变量会./say_hello.sh按预期复制到您的子进程中。但是您没有对您的函数执行相同的操作,hello()因此该函数是一个简单的本地符号,不会复制到新的子环境中。

使用 bash 导出函数的语法使用-f以下参数export

export -f hello

相关内容