您如何将带有参数的命令发送到 GNU parallel?

How do you send commands with arguments already inside them to GNU parallel?

我有一个 bash 数组:

nodes=(
    "command"
    "command arg"
    ...
    )

并且我想 运行 所有命令以及已经使用 GNU parallel 附加到它们的所有参数。

我试过了

printf '%s\n' "${nodes[@]}" | parallel python

parallel python ::: "${nodes[@]}"

输出命令为

python path_to_file\ arg

它给出的错误是"can't open file 'path_to_file arg'"

我认为问题出在那个反斜杠上 - 当我 运行 没有并行的命令时,我得到了同样的错误。

如何防止它插入反斜杠?

您需要将 space 上的输入拆分为参数。例如,您可以(滥用)使用 shell 的分词扩展。 parallel 按原样传递了您的参数,因此您 运行 python "command arg" - 保留了一个保留文字 space 的参数。但是我猜你想要 python command arg - 传递两个参数并且 space 充当分隔符。

parallel 'python $*' ::: "${nodes[@]}"

使用 xargs 看起来像:

printf "%s\n" "${nodes[@]}" | xargs -l sh -c 'python $*' --

尝试:

printf '%s\n' "${nodes[@]}" | parallel eval python 

eval 是一个 shell 命令,它将字符串计算为 shell 表达式。我通常用它来 "de-quote" 一个字符串。

或:

printf '%s\n' "${nodes[@]}" | parallel python {=uq=}

较新版本的 GNU Parallel 有 uq(),这使得值不被引用。通常 GNU Parallel 会引用值。

或:

printf '%s\n' "${nodes[@]}" | parallel 

上述规则的例外情况是没有命令。然后该值不带引号。