我有一个 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.bash
它say_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