我有一个类似的目录:
.
|__ main
|__ app
| |__ master_script.sh
| |__ master_parameters.sh
|
|__ submodule
|__ script.sh
|__ parameters.sh
|__ functions.sh
我想运行master_script.sh
,它使用source
来设置一些带有master_parameters.sh
的变量。master_script.sh
然后调用script.sh
,script.sh
也在parameters.sh
和functions.sh
上使用source
,但是当我这样做时,parameters.sh
中的变量和functions.sh
中的函数似乎都没有设置。
因此,当script.sh
尝试使用其中一个函数时,我收到错误"未找到命令"
即:
parameters.sh
my_foo="another thing"
functions.sh
functions do_task {
echo "task done"
}
script.sh
do_task
master_parameters.sh
submodule_path=$(realpath "../../submodule")
my_foo="something"
master_script.sh
source master_parameters
cd $submodule_path
source parameters.sh
source functions.sh
./script.sh
这里,当master_script.sh
执行./script.sh
时,它不会找到函数do_task
,因为它没有被正确地源化。
环顾四周,似乎有一些关于在不同的目录中寻找源代码的问题?我试过使用绝对路径,但没有解决这个问题。有什么想法如何解决这个问题?
3条答案
按热度按时间xtfmy6hx1#
你使用
./script.sh
来调用你想要使用导入函数的脚本,但是这不起作用,当我们使用./script.sh
调用它时,它会创建一个不包含导入函数的新bash会话,要解决这个问题,只需使用source script.sh
或. script.sh
,这样它将使用相同的shell会话,并保留从其他文件导入的函数和变量。hmtdttj42#
事实:
export
导出。export -f
。如何解决这个问题?
在运行
./script.sh
之前导出函数.export -f do_task
。源代码
./script.sh
,使其继承整个当前执行环境。为了不影响当前shell,请在subshell.( source ./script.sh )
中运行它。请注意,
source file
在PATH
中搜索文件。使用source ./file
从当前工作目录获取源文件,这与在命令行上运行./prog
和运行prog
的区别相同。主观上,比起
function do_task {
,更喜欢do_task() {
,除非您真的想与ksh兼容。w8rqjzmb3#
在这种情况下,我建议您通过以下方法将相对路径转换为半绝对路径: