【发布时间】:2021-01-10 13:53:44
【问题描述】:
我有一个 sh 文件(名为 a.sh),我使用命令 sbatch 为我的项目处理它,所以我输入了很多:
sbatch a.sh
a.sh 有 2 条关键行(我猜其余的都无关紧要)。他们是
来源/okyanus/progs/gaussian/g16/bsd/g16.sariyer.profile
和
g16 dtn-b3-0-0.gjf
第二个在文件的末尾(后面会提到aaa.com),它是需要改变的。并且 aaa.com 应该和 a.sh 在同一目录下才能提交作业 aaa.com。
在a.sh 文件中,有一个文件名(比如说aaa.com),该文件的数据用于sbatch 进程。所以我要做的一个标准操作让我们说接下来的 4 个工作是:
- 修改
a.sh文件以更改寻址文件的名称(例如将aaa.com更改为aab.com),写入并退出 - 输入:
sbatch a.sh(开始操作) - 修改
a.sh文件以更改寻址文件的名称(例如将aab.com更改为aac.com),写入并退出 - 输入:
sbatch a.sh(开始操作) - 修改
a.sh文件以更改寻址文件的名称(例如将aac.com更改为aad.com),写入并退出 - 输入:
sbatch a.sh(开始操作) - 修改
a.sh文件以更改寻址文件的名称(例如将aad.com更改为aae.com),写入并退出 - 输入:sbatch
a.sh(开始操作)
但是,我曾经有一个带有sed -i 的命令模板。该命令可以一次完成这 8 项操作。从我的旧笔记中,我可以找到旧模板的某些部分。
我的旧模板是一个简短的版本,但可以有效地使用以下命令一步执行前两个操作:
sed -i 's/aaa.com/aab.com/g' a.sh ; sbatch a.sh
上面的命令同时执行第一步和第二步。我知道我使用了一个可以同时执行所有 8 个步骤的命令。我是这样的:
sed -i 's/aaa.com/aab.com???aab.com/aac.com???aac.com/aad.com???aad.com/aae.com/g' a.sh ; sbatch a.sh
上述命令可以一次完成所有 8 个步骤,提交接下来的 4 个作业。但是,我不记得应该写什么了???成功执行命令的部件。
我确信我建议的命令在其正确状态下工作。任何其他想法和帮助将不胜感激。
P.S.:a.sh 文件是系统生成的。它获取与化学相关的程序,然后将 .com(或 .gjf)文件的值提交给它运行的化学程序。
谢谢!
【问题讨论】:
-
你可以使用例如
for循环。是否可以选择更改脚本a.sh以将文件作为命令行参数进行处理?然后您可以将其称为a.sh aaa.com等,也可以使用for f in aaa aab aac ; do sbatch a.sh ${f}.com ; done如果您愿意edit 您的问题并在a.sh中显示代码,那么提供更好的建议或完整答案会更容易。 -
如果由于某种原因无法更改
a.sh,则将a.sh更改为b.sh并编辑b.sh。不断修改脚本是荒谬的。请改用参数。 -
如果您使用的
sbatch是接受--input指令以读取批处理脚本的标准输入的那个,如果从sbatch 传递参数很困难,也许您想做sed ... a.sh | sbatch --input -
更改 a.sh 文件是一个选项。事实上,如果我们没有捷径,它是一种选择。我必须修改它可能 10 次,并在每次修改后编写 sbatch a.sh 命令。这里的想法是一步到位。我试图通过一步完成 20 次操作来赢得时间。为什么这是荒谬的?
-
处理状态总是很困难的。而是考虑编写一个模板文件和一个带参数的数组,而不是 修改
a.sh文件,重新创建整个文件 - 更少的状态,更少的问题。