我想并行运行一些超过二的幂的脚本。通过给 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) =}'