1
    open UNIT_TESTER, qq(tcsh -c "gpath $dir/$tsttgt;  bin/rununittests"|);
    while(<UNIT_TESTER>){
        reportError($ignore{testabort},$tsttgt,"test problem detected for $tsttgt:$_ ") if /core dumped/;
        reportError($ignore{testabort},$tsttgt,"test problem detected for $tsttgt:$_ ") if /\[  FAILED  \]/;
        writelog($tsttgt,$_);
    }
    close UNIT_TESTER;

この構文を使用してstderrをstdoutにリダイレクトしようとしましたが、機能しませんでした。

open UNIT_TESTER, qq(tcsh -c "gpath $dir/$tsttgt;  bin/rununittests >& "|);

私はperlFAQの議論も読みましたが、それはbashに関連していました:http://www.perl.com/doc/FAQs/FAQ/oldfaq-html/Q5.15.html

4

4 に答える 4

2

CPAN のCapture::Tinyモジュールを使用してキャプチャを行うことをお勧めします。小さく、シンプルで、十分にテストされています。洗練された API を備えており、依存関係がまったくない場合は、プログラムに簡単に埋め込むことができます。

それとは別に、実行中のテストプログラムを制御できる場合は、Test Anything Protocolを調査することをお勧めします。テスト プログラムの出力を TAP にすることができれば、テストの要約を含むユース ケースは次のように単純になります。

perl -MTest::Harness -e 'runtests(@ARGV)' bin/rununittests

2 番目の段落についての注意: 潜在的に最近の Test::Harness が必要です。また、シェルの呼び出しに関して必要なことはまったく行いませんが、十分に近づけるはずです。

于 2010-06-08T09:00:38.313 に答える
1

次のように、ハンドル 2 (stderr) をハンドル 1 (stdout) にリダイレクトしてみてください。

UNIT_TESTER を開く, qq(tcsh -c "gpath $dir/$tsttgt; bin/rununittests 2>&1 "|);

于 2010-06-08T07:05:46.097 に答える
1

(少なくとも) 2 つのオプションが思い浮かびます。

open UNIT_TESTER, qq(tcsh -c "gpath $dir/$tsttgt >&;  bin/rununittests >& "|);

open UNIT_TESTER, qq(sh -c "{ gpath $dir/$tsttgt;  bin/rununittests; } 2>&1"|);

2 つ目はチートです。Bourne/Korn/POSIX/Bash シェル表記を使用します。注意しないと、最初のコマンドではなく、2 番目のコマンドのみのエラー出力になることに注意してください。

于 2010-06-08T07:10:25.773 に答える
0

BillThorのおかげで、私は解決策に出くわしました。

open UNIT_TESTER, qq(tcsh -c "gpath $dir/$tsttgt;  bin/rununittests |& cat "|);
于 2010-06-08T07:20:29.903 に答える