运行 一个 bash 函数

Running a bash function

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

helper_v1.sh:

method1() {
    cmd1 params
}

method2() {
    cmd1 other_params
}

helper_v2.sh:

method1() {
    cmd2 params
}

method2() {
    cmd2 other_params
}

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

source helper_v2.sh
srun method1 params

但失败并显示错误:

slurmstepd: error: execve(): method1: No such file or directory

有什么方法可以将那些 bash 函数与 srun 一起使用吗?遗憾的是必须将它们全部重新实现为单独的脚本。

source 仅在您处于单个 bash 进程中时才有效。函数在命令之间并不能很好地工作。您也许可以通过使用 export -f method1 method2 导出您的函数来让它工作,但我不建议走那条路。

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

method1() {
    cmd2 params
}

method2() {
    cmd2 other_params
}

case "" in
    method1) method1;;
    method2) method2;;
    *) echo ": no such function" >&2; exit 1;;
esac

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

method1() {
    cmd2 params
}

method2() {
    cmd2 other_params
}

"$@"

两种情况下的用法为:

helper_v2.sh method2