linux 使用另一个目录中的函数获取bash文件,错误为“未找到命令”

xmq68pz9  于 2023-02-03  发布在  Linux
关注(0)|答案(3)|浏览(207)

我有一个类似的目录:

.
|__ 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.shscript.sh也在parameters.shfunctions.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,因为它没有被正确地源化。
环顾四周,似乎有一些关于在不同的目录中寻找源代码的问题?我试过使用绝对路径,但没有解决这个问题。有什么想法如何解决这个问题?

xtfmy6hx

xtfmy6hx1#

你使用./script.sh来调用你想要使用导入函数的脚本,但是这不起作用,当我们使用./script.sh调用它时,它会创建一个不包含导入函数的新bash会话,要解决这个问题,只需使用source script.sh. script.sh,这样它将使用相同的shell会话,并保留从其他文件导入的函数和变量。

hmtdttj4

hmtdttj42#

事实:

  • 默认情况下不导出变量。
  • 可以使用export导出。
  • 默认情况下不导出函数。
  • 可以导出在Bash到Bash中,使用export -f
  • 子进程继承导出的环境(简化)。

如何解决这个问题?
在运行./script.sh之前导出函数. export -f do_task
源代码./script.sh,使其继承整个当前执行环境。为了不影响当前shell,请在subshell. ( source ./script.sh )中运行它。
请注意,source filePATH中搜索文件。使用source ./file从当前工作目录获取源文件,这与在命令行上运行./prog和运行prog的区别相同。
主观上,比起function do_task {,更喜欢do_task() {,除非您真的想与ksh兼容。

w8rqjzmb

w8rqjzmb3#

在这种情况下,我建议您通过以下方法将相对路径转换为半绝对路径:

script_abs_path=$(readlink -f $(dirname $0))
source ${script_abs_path}/submodule/script.sh

相关问题