Bashのプロセス置換で並列実行 & 待ち合わせ

シェルスクリプトで時間のかかる処理を並列で実行したい。
さらに各実行結果を取り出して順に並べるのにはBashのプロセス置換を使うと便利。

プロセス置換というのは本来ファイル名を書くところに一連のコマンドを記述できる機能。

<( command list... )
でcommand list...の結果をファイルのように読み込み、

>( command list... )
でcommand list...にファイルのように渡すことができる。

例えば、円周率を求めるのに高野の公式の4項を並列で計算して
最後に各項の和を求める処理は以下のような感じ(計算本体はbcで実行)。


#!/bin/bash
cat <(echo 'print sum(1/49,         -(49^2)),  "*48+"'  | bc -q pi10000.bc) \
    <(echo 'print sum(1/57,         -(57^2)), "*128-"'  | bc -q pi10000.bc) \
    <(echo 'print sum(1/239,       -(239^2)),  "*20+"'  | bc -q pi10000.bc) \
    <(echo 'print sum(1/110443, -(110443^2)),  "*48\n"' | bc -q pi10000.bc) | bc -q

pi10000.bc
scale = 10005;

define sum(t, c) {
  auto n, s

  for (n = 1; t != 0; n += 2) {
    s += t / n
    t /= c
  }

  return s
}
[参考:高野の公式]
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%81%E3%83%B3%E3%81%AE%E5%85%AC%E5%BC%8F

このように一時ファイルを使わずにパイプのように使える。
プロセス置換はkshやzshでも使えるみたい。

2 件のコメント:

  1. diff <(grep hoge log1.txt) <(grep hoge log2.txt)とかも便利ですよね〜

    返信削除
    返信
    1. そうそう。
      そうやって複数のストリームをファイルの様に扱えるところがいいんですよね。

      削除