与 GNU 并行的算术

与 GNU 并行的算术

我想并行运行一些超过二的幂的脚本。通过给 GNU Parallel 一个我想要的两个幂的列表来做到这一点效果很好:

%>parallel echo {} ::: 32, 64, 128, 256, 512, 1024
32
64
128
256
512
1024
%>

我还可以毫无问题地为 GNU Parallel 提供一系列值:

%>parallel echo {} ::: {5..10}
5
6
7
8
9
10
%>

但是,一旦我在 GNU Parallel 命令中包含算术位,就会遇到语法错误:

%>parallel echo $((2**{})) ::: {5..10}
bash: 2**{}: syntax error: operand expected (error token is "{}")
%>

这让我感到惊讶,因为我可以在 for 循环中生成这些值,如下所示:

%>for N in {5..10}; do echo $((2**N)); done
32
64
128
256
512
1024
%>

使用 GNU Parallel 执行此操作的方法是什么?我不关心秩序。

答案1

您需要引用 正在运行的整个命令parallel,例如:

$ parallel 'echo $((2**{}))' ::: {5..10}
32
64
128
256
512
1024

实际上,仅引用命令的 bash 算术部分也可以:

$ parallel echo '$((2**{}))' ::: {5..10}
32
64
128
256
512
1024

原因是如果没有引号,bash 将尝试扩展并评估算术将其传递给parallel,2**{}并不意味着有任何值得抨击的事情。错误消息实际上来自 bash,而不是并行的:

$ echo $((2**{}))
-bash: 2**{}: syntax error: operand expected (error token is "{}")

答案2

@cas 展示了如何使用 shell。我个人喜欢使用 {= perl =} 替换字符串来做到这一点:

parallel echo '{= $_=2**$_ =}' ::: {5..10}

但差异很小,更多只是品味问题。

在某些情况下,Perl 版本更好:如果您由于某种原因被迫使用没有结构$(( expression ))(例如鱼)或需要更多计算功能的 shell:parallel echo '{= $_=2**($_/2) =}'

相关内容