我目前正在使用 Platform LSF 的 bsub 作业提交系统。我需要提交作业脚本,但在向作业脚本传递参数时遇到问题。
我需要的内容如下:作业脚本是一个带有一个命令行参数的 bash 脚本。我需要将参数传递给该脚本,然后重定向该脚本以用作 bsub 的输入。问题是该参数没有应用于脚本。
我努力了:bsub < script.bsub 1
script.bsub 是我的脚本,1 是数字参数。这种方法行不通。 1 被视为 bsub 的参数。
另一种方法:bsub < "script.bsub 1"
这种方法使 bsub 将整个双引号行视为文件名。
有没有办法首先将命令行参数应用于脚本,然后使用参数将该脚本重定向到另一个程序作为输入?如果有人有 bsub 的经验那就更好了。
更新和解决方法:
似乎将命令行参数应用于 bsub 文件是一个非常复杂的过程。我尝试了下面所述的 HEREDOC 方法,但 bsub 的行为就像脚本文件名是命令一样。因此,解决此问题的最简单方法就是根本不使用输入重定向。
要将参数传递给要在 bsub 中运行的脚本,请首先在命令行中而不是在脚本文件中指定所有 bsub 参数。然后运行脚本文件,使用
"sh script.sh [arg]"
在所有 bsub 参数之后。因此整行看起来像这样:
bsub -q [queue] -J "[name]" -W 00:10 [other bsub args] "sh script.sh [script args]"
这并没有回答我原来的问题,但至少对于 bsub 这是解决我的问题的最简单的方法。
答案1
您需要此处文档或此处字符串。
bsub <<HEREDOC
$(script.bsub 1)
HEREDOC
这就是此处文档的样子。 shell 将读取发生的行之间的所有内容的扩展,<<HEREDOC
直到找到仅HEREDOC
发生任何事情的行,并将输出传递到其文件描述符 0 - stdin 上的调用命令。
这里的字符串原则上是相同的:
bsub <<< script.bsub 1
它可能看起来使用起来更简单,但也更容易混淆,而且不是可移植的 shell 脚本。虽然here文档被定义为POSIX shell标准的一部分,但here字符串是shell特定的实现 - 尽管它可以在bash中工作。
最好在每个脚本情况下使用此处文档,除非您可以 100% 确定该脚本永远不会在不会中断的环境中运行,并且仅在交互式使用中使用此处字符串,因为它们首先,它们只不过是一条捷径。
当然,如果其中任何一个有效,那么可能:
script.bsub 1 | bsub
也会这样做。这会将|pipe
script.bsub
的标准输出转换为bsub
的标准输入,但它也很可能bsub
在子 shell 中运行。如果bsub
以任何方式修改当前 shell 环境(例如更改 shell 变量的值),则|pipe
可能不是最佳解决方案。
答案2
似乎将命令行参数应用于 bsub 文件是一个非常复杂的过程。我尝试了 mikeserv 规定的 HEREDOC 方法,但 bsub 的行为就像脚本文件名是命令一样。因此,解决此问题的最简单方法就是根本不使用输入重定向。
由于我的问题特别涉及 Platform LSF 的 bsub,因此以下可能是解决此类参数问题的最佳方法:要将参数传递给要在 bsub 中运行的脚本,首先在命令行中而不是在脚本文件。然后运行脚本文件,使用
"sh script.sh [arg]"
在所有 bsub 参数之后。因此整行看起来像这样:
bsub -q [queue] -J "[name]" -W 00:10 [other bsub args] "sh script.sh [script args]"
在这种情况下,最好不要对脚本使用 .bsub 文件,而是使用普通的 .sh 脚本,并使用 Unix sh 命令带参数运行它。