将参数传递给脚本,然后将脚本重定向为 bsub 的输入

将参数传递给脚本,然后将脚本重定向为 bsub 的输入

我目前正在使用 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 命令带参数运行它。

相关内容