flock
操作を連動させる方法の1つです。このユーティリティはutil-linuxツールセットの一部であり、Linuxでのみ使用可能です。幅広いプラットフォームで利用可能なその他のsetlock
ユーティリティは、daemontoolsパッケージのDaniel J. Bernsteinのユーティリティに基づいています。
これらのツールは、M。Kurenkovの回答(flock
採用することはできますが、その回答には含まれていません)で使用されているパラダイムとは少し異なります。setlock
プログラムを呼び出して、インターロックする必要のあるコマンドにロードをチェーンします。 setlock
それ自体がロックファイルを開いてロックし、そのプロセスでファイル記述子を開いたままにします。ロックは、そのプロセスが続く限り持続します(開いているファイル記述子を見つけて閉じることによって明示的にロックを解放するために連鎖された後続のコマンドを除く)。
質問の場合、シェルの組み込みコマンドの代わりに外部 echo
を呼び出すことに注意して、出力行を生成するコマンドをインターロックする必要がありますecho
。
setlock mylockfile echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
この場合、出力ファイルを追加モードで開くことを連動させる必要はありません。ある場合は、ロック内でそのファイルを開く必要があります。そのため、fdredir
/ などのプログラムを使用する必要がありますredirfd
。
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
必要に応じてシェル関数に変換できます:
outfile(){setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[…]
outfile echo "$ RESULT"
または、シェル構文に固執し、インターロックの下で実行されている2番目のシェルによって解釈されるようにします。シェル変数が環境変数としてエクスポートされない場合、いくつかの重要な引用が必要です。
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '
もちろん、これは出力ファイルへの書き込み以外のものに一般化されます:
setlock mylockfile sh -c '…インターロック; もの… '
`pwd`
。ドット(.
)のみを使用できます。また、変数が含まれているため、ファイル名全体を引用する必要があります。