私は単純な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
実際にコードでは。diff
kill
program
()
スクリプトのもう1つの潜在的な問題は、;の終了を待つkill
ように設計されていないことです。program
代わりに信号のみを送信します。したがって、diff
出力全体がキャプチャされずに競合状態が機能することがわかりますprogram
。wait
組み込みの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)
使用して同様のスクリプトを試してください。)diff
yes
slowyes
while 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/sh
Debianのようにサポートしていないbash
)、他の答えに示すようにパイプを使用することもできます。
{ your_program & sleep 1; kill $!; } | diff -y output1.txt -
この場合も同じ注意事項が適用されます。