运行 bash 函数

Pos*_*shi 2 bash slurm

为了轻松更改我在软件中使用的软件包的版本,我生成了一个bash带有调用底层软件的函数的接口。这样,我的主脚本可以保持相同的界面,我只需要更改/添加每个要使用的版本的帮助程序脚本:

助手_v1.sh:

method1() {
    cmd1 params
}

method2() {
    cmd1 other_params
}
Run Code Online (Sandbox Code Playgroud)

helper_v2.sh:

method1() {
    cmd2 params
}

method2() {
    cmd2 other_params
}
Run Code Online (Sandbox Code Playgroud)

现在我需要通过启动这些命令来srun将工作分配到不同的节点上。所以我正在尝试(在使用 启动的脚本内sbatch):

source helper_v2.sh
srun method1 params
Run Code Online (Sandbox Code Playgroud)

但它失败并出现错误:

slurmstepd: error: execve(): method1: No such file or directory
Run Code Online (Sandbox Code Playgroud)

有什么办法可以使用这些bash功能吗srun?不得不将它们全部重新实现为单独的脚本将是一种遗憾。

Joh*_*ica 5

source仅当您位于单个 bash 进程中时才有效。函数并不能很好地跨命令工作。您也许可以通过使用 导出函数来使其工作export -f method1 method2,但我不建议走这条路。

一些封装会更好。您可以做的就是让帮助程序脚本像真实程序一样被调用,方法是让它们将要调用的函数作为参数。它可以像添加一条case语句一样简单:

method1() {
    cmd2 params
}

method2() {
    cmd2 other_params
}

case "$1" in
    method1) method1;;
    method2) method2;;
    *) echo "$1: no such function" >&2; exit 1;;
esac
Run Code Online (Sandbox Code Playgroud)

或者,您可以采用更简单的方式,编写"$@"简单的调用调用者在命令行上传递的任何内容,而不检查它是什么。

method1() {
    cmd2 params
}

method2() {
    cmd2 other_params
}

"$@"
Run Code Online (Sandbox Code Playgroud)

任何一种情况下的用法都是:

helper_v2.sh method2
Run Code Online (Sandbox Code Playgroud)