运行 一个 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
为了轻松更改我在软件中使用的包的版本,我生成了一个 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