プロセスを終了し、結果を比較します。

プロセスを終了し、結果を比較します。

私は単純なbashスクリプトを書こうとしましたが、うまくいきません。

私が欲しい:

  • プログラムを起動し、テキストファイルの入力を提供します(./prog < input1.txt)。
  • しばらく待ってからキーボードで邪魔されたように終了します(& PID=$!; sleep 1; kill -INT $PID)。源泉
  • プログラム出力とテキストファイルの違いを見つける(| diff -y output1.txt -源泉

これが私が今持っているものです。前の手順をまとめると、次のようになります。

./program < input1.txt & PID=$!; sleep 1; kill -INT $PID | diff -y output1.txt -

このバージョンではPID行が非表示になっているため、最初のコマンドの出力は常に報告されません。プログラム名の後にファイルリダイレクトを追加すると、リダイレクトを指すため、killコマンドは機能しなくなります。

bash --version編集:Ubuntu 16.04を使用しています。GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

答え1

実際にコードでは。diffkillprogram()

スクリプトのもう1つの潜在的な問題は、;の終了を待つkillように設計されていないことです。program代わりに信号のみを送信します。したがって、diff出力全体がキャプチャされずに競合状態が機能することがわかりますprogramwait組み込みのbashバックグラウンドプロセスが終了するまで、プログラムで待つことをお勧めします。

上記の修正を含むコード例は次のとおりです。

#!/bin/bash
(
    ./program <input1.txt &
    PID=$!
    sleep 1
    kill -INT $PID
    wait
) | diff -y reference_output.txt -

答え2

プロセス置換[1]を使用できます。

diff -y output1.txt <(your_program & sleep 1; kill $!)

1秒以内に大量のデータを生成できる場合your_program(たとえば、マシンをyes(1)使用して同様のスクリプトを試してください。)diffyesslowyeswhile echo y; do sleep .01; done

プロセス<(...)の交換が実行中です。平行にしたがって、diffデータ処理を開始する前に完了するまで待機しません。

your_programしばらくしてではなく、複数の行を作成して停止する方が良いと思います。

diff -y output1.txt <(your_program | head -n 1000)

この場合、通常はパイプの左側から行ったようにyour_program取り外す必要があります。SIGPIPEプログラムが無視SIGPIPEしてwrite(2)エラーが発生した場合は、それに関する別の質問、修正方法、または解決方法をお問い合わせください。

[1]シェルがプロセス置換をサポートしていない場合(/bin/shDebianのようにサポートしていないbash)、他の答えに示すようにパイプを使用することもできます。

{ your_program & sleep 1; kill $!; } | diff -y output1.txt -

この場合も同じ注意事項が適用されます。

関連情報