您如何将带有参数的命令发送到 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
上述规则的例外情况是没有命令。然后该值不带引号。
我有一个 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
上述规则的例外情况是没有命令。然后该值不带引号。