假设我有以下简单的bash脚本,希望通过SLURM提交给批处理服务器:

#!/bin/bash

#SBATCH -o "outFile"$1".txt"
#SBATCH -e "errFile"$1".txt"

hostname

exit 0

在这个脚本中,我只想将hostname的输出写在一个文本文件上,我通过命令行控制它的全名,如下所示:
login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1
Submitted batch job 203775

不幸的是,我的最后一个命令行参数(1)似乎没有通过sbatch解析,因为创建的文件没有我要查找的后缀,字符串“$1”被逐字解释为:
login-2:jobs$ ls
errFile$1.txt  exampleJob.sh outFile$1.txt

我到处找过SOelsewhere的地方,但没什么运气。本质上,我要寻找的是与启用转矩的集群中-v实用程序的qsub开关等效的。
编辑:正如底层评论线程中所提到的,我用一种艰难的方式解决了我的问题:我创建了一个“主脚本”,它只是简单地将相同的内容回显并重定向到不同的脚本,每个脚本的内容正在被传递的命令行参数更改。然后,我通过sbatch将所有这些内容提交给我的批处理服务器。但是,这并不能回答原来的问题,所以我犹豫要不要把它作为我的问题的答案,或者把这个问题标出来。

最佳答案

以SBATCH开头的行不由bash解释,而是由SBATCH替换为代码。
sbatch选项不支持$1 vars(只有%j和其他一些选项,用%1替换$1将不起作用)。
当没有不同的sbatch进程并行运行时,可以尝试

#!/bin/bash

touch outFile${1}.txt errFile${1}.txt
rm link_out.sbatch link_err.sbatch 2>/dev/null # remove links from previous runs
ln -s outFile${1}.txt link_out.sbatch
ln -s errFile${1}.txt link_err.sbatch

#SBATCH -o link_out.sbatch
#SBATCH -e link_err.sbatch

hostname
# I do not know about the background processing of sbatch, are the jobs still running
# at this point? When they are, you can not delete the temporary symlinks yet.

exit 0

备选方案:
正如你自己在评论中所说,你可以做一个剧本。
此脚本可以包含如下行
cat  exampleJob.sh.template | sed -e 's/File.txt/File'$1'.txt/' > exampleJob.sh
# I do not know, is the following needed with sbatch?
chmod +x exampleJob.sh

在模板中,SBATCH行看起来像
#SBATCH -o "outFile.txt"
#SBATCH -e "errFile.txt"

关于bash - 通过sbatch传递命令行参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27708656/

10-10 21:25