Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2810

シェルスクリプトでxargsを使って関数に引数を渡したい

$
0
0

シェルスクリプトで複数並列で実行したいときに、xargs-Pオプションを使えることを知りました。
xargsから-Pでプロセス数を指定すれば複雑な処理も並列でできるじゃん!と思いましたが、なかなかできずに詰まりました。

シェルで並列実行したいはずが、気づけばxargsで関数に引数を渡したい人になっておりました笑
結論から言うと、以下で実現できました。

export-ffunction${ARRAY} | xargs -n 1 -I{} bash -c"function {}"

具体的なシェルスクリプトだと、以下のようです。

#!/bin/bashfunction randomWait(){TARGET=$1sec=`expr$RANDOM % 10`sleep$sececho${TARGET}}export-f randomWait
cat hogehoge.txt | xargs -n 1 -I{}-P 10 bash -c"randomWait {}"

例えば、hogehoge.txtに1-20までの数字をいれておくと、ランダムな順番で出力されます。

xargsのオプション
-nで一度に渡す引数の数を指定します。今回の関数は引数をひとつとるので、1を指定しています。
-Iで置換文字列を指定しています。{}を指定して、doubleEchoに引数を渡すようにしています。
-Pで並行実行プロセス数を指定しています。

exportのオプション
-fでシェル変数としてexportしています。これでコマンドとして認識されます。

bashのオプション
-cで後に指定する文字列をコマンドを引数つきで実行してくれます。

参考

https://qiita.com/D-3/items/8bdb834ff53256cef481
http://171rr.blog.fc2.com/blog-entry-14.html


Viewing all articles
Browse latest Browse all 2810

Trending Articles