GNUを使用した並列演算

GNUを使用した並列演算

2の累乗でいくつかのスクリプトを並列に実行したいと思います。私が望む2つの機能のリストを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 "{}")

おすすめ記事