首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过批处理传递命令行参数

通过批处理传递命令行参数
EN

Stack Overflow用户
提问于 2014-12-30 16:06:26
回答 5查看 49K关注 0票数 59

假设我有以下简单的bash脚本,我想通过SLURM将其提交到批处理服务器:

代码语言:javascript
复制
#!/bin/bash

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

hostname

exit 0

在这个脚本中,我只想在一个我通过命令行控制其全名的文本文件上编写hostname的输出,如下所示:

代码语言:javascript
复制
login-2:jobs$ sbatch -D `pwd` exampleJob.sh 1
Submitted batch job 203775

不幸的是,我的最后一个命令行参数(1)似乎没有通过S批处理进行解析,因为创建的文件没有我要查找的后缀,字符串"$1“是按字面解释的:

代码语言:javascript
复制
login-2:jobs$ ls
errFile$1.txt  exampleJob.sh outFile$1.txt

我环顾过所以其他地方的地方,但我没有任何运气。本质上,我正在寻找的是相当于-v开关的qsub实用工具在扭矩启用集群。

编辑:正如底层评论线程中提到的那样,我以困难的方式解决了我的问题:我创建了一个“主脚本”,它简单地将相同的内容回显并重定向到不同的脚本中,每个脚本的内容都被传递的命令行参数更改,而不是将一个脚本多次提交给批处理服务器,每个脚本都有不同的命令行参数。然后,我通过sbatch将所有这些都提交给了我的批处理服务器。然而,这并没有回答原来的问题,所以我不愿意把它作为我的问题的答案或标记这个问题解决了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-12-31 10:28:50

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

代码语言:javascript
复制
#!/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

另一种选择:正如你自己在评论中所说的,你可以做一个主笔。此脚本可以包含以下行:

代码语言:javascript
复制
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行如下所示

代码语言:javascript
复制
#SBATCH -o "outFile.txt"
#SBATCH -e "errFile.txt"
票数 7
EN

Stack Overflow用户

发布于 2017-05-24 21:26:08

使用包装器更方便。我从这条线找到了这个解决方案。

基本上,问题是SBATCH指令被shell看作是注释,因此不能在其中使用传递的参数。相反,您可以在相应地设置参数之后,在bash脚本中使用这里的文档。

如果您有问题,可以用以下内容替换shell脚本文件:

代码语言:javascript
复制
#!/bin/bash
sbatch <<EOT
#!/bin/bash

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

hostname

exit 0
EOT

然后像这样运行shell脚本:

代码语言:javascript
复制
bash [script_name].sh [suffix]

并将输出保存到outFilesuffix.txt和errFilesuffix.txt中。

票数 23
EN

Stack Overflow用户

发布于 2016-02-10 12:02:11

如果通过命令行传递命令,实际上可以绕过不能在批处理脚本中传递命令行参数的问题。例如,在命令行:

代码语言:javascript
复制
var1="my_error_file.txt"
var2="my_output_file.txt"
sbatch --error=$var1 --output=$var2 batch_script.sh
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27708656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档