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

kal*_*gne 4 export environment-variables bash-scripting

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

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

export BASH_USEFUL=/path/to/useful
source $BASH_USEFUL/src-useful.bash
Run Code Online (Sandbox Code Playgroud)

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

$ echo $BASH_USEFUL
/path/to/useful

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

$ hello
hello!
Run Code Online (Sandbox Code Playgroud)

我创建了一个脚本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?
Run Code Online (Sandbox Code Playgroud)

如果我来源$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
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

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

export -f hello
Run Code Online (Sandbox Code Playgroud)