Bashで競合状態が発生しますか?

Bashで競合状態が発生しますか?

コマンドの出力を以前に同じコマンドを実行した結果と比較するスクリプトがあります。最大しかし、時には期待どおりに動作しないことがあります。

テストラインで問題を再現できました。私はこれを2つの別々のファイルを比較することで簡単に分割できることを知っており、問題は消えます。しかし、ここで実際に何が起こっているのか、そして私が達成したいことを達成する方法があるのか​​を理解したいと思います。それ。

以下は、複数回実行されたコマンドの出力です。 1つのケースでは、「test」がエコーされていることがわかりますが、ほとんどの場合、期待どおりに機能します。

root@dev:~# comm -13 /tmp/test <(echo '"test"' | cut -d'"' -f2 | sort -u | tee /tmp/test)
root@dev:~# comm -13 /tmp/test <(echo '"test"' | cut -d'"' -f2 | sort -u | tee /tmp/test)
root@dev:~# comm -13 /tmp/test <(echo '"test"' | cut -d'"' -f2 | sort -u | tee /tmp/test)
root@dev:~# comm -13 /tmp/test <(echo '"test"' | cut -d'"' -f2 | sort -u | tee /tmp/test)
root@dev:~# comm -13 /tmp/test <(echo '"test"' | cut -d'"' -f2 | sort -u | tee /tmp/test)
test
root@dev:~# comm -13 /tmp/test <(echo '"test"' | cut -d'"' -f2 | sort -u | tee /tmp/test)
root@dev:~# comm -13 /tmp/test <(echo '"test"' | cut -d'"' -f2 | sort -u | tee /tmp/test)
root@dev:~# comm -13 /tmp/test <(echo '"test"' | cut -d'"' -f2 | sort -u | tee /tmp/test)

私は走っていUbuntu 10.04ますbash 4.1-2ubuntu3.5coreutils 7.4-2ubuntu3

答え1

はい、これは競争条件です。

問題は、シェルがパイプ内のすべてのプロセスを同時に起動し、teeが起動時に出力ファイルを切り捨てることです。 teeがcommより速い場合、comm用のファイルは空になり、そうでない場合は空です。

複数回実行すると(おそらくループ内)、パイプラインの動作を確認できます。

date '+first:  %T'|(cat>&2;sleep 5)|date '+second: %T'

答え2

二度現れる「テスト」が何であるかは明確ではないので、あなたのラインは私を少し混乱させます。 - だから私はあなたの殻も混乱していることを本当に理解しています。 ;)

私が正しく理解した場合、最初の「/tm​​p/test」はコマンドの前の出力に対応し、2番目は新しい出力に対応する必要があります。

stdinに新しい出力が含まれていることはわかりますが、ファイルの内容は定義されていません。commファイルを読み込んだときにまだ起動していない可能性がありますtee。この場合、最後の実行の前の「テスト」行は引き続き含まれます。または、teeすでに完了している可能性があります。この場合、現在実行中の「テスト」行が含まれます。または、tee始めてファイルを消去して新しいコンテンツを作成する予定です。これが発生した場合は、標準入力の「テスト」を空のファイルと比較して出力を表示できます。

2つの異なる出力を比較しようとしています。 2つの異なるファイルがなければ、これを行う方法はありません。 2つの異なる(適切な名前の)ファイルを使用すると、行を読みやすくし、最初に発生する混乱を解決できます。 ;)

関連情報