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 >& "|);

我还阅读了关于 perl FAQ 的讨论,但那是与 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

关于第二段的注意事项:可能需要最近的 Test::Harness。此外,关于 shell 调用,它并不能完全满足您的需求,但它应该让您足够接近。

于 2010-06-08T09:00:38.313 回答
1

两个选项(至少)浮现在脑海:

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

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

二是作弊;它使用 Bourne/Korn/POSIX/Bash shell 表示法。请注意,除非您小心,否则您最终只会得到第二个命令而不是第一个命令的错误输出。

于 2010-06-08T07:10:25.773 回答
1

尝试将句柄 2 (stderr) 重定向到句柄 1 (stdout),如下所示。

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

于 2010-06-08T07:05:46.097 回答
0

感谢 BillThor,我偶然发现了一个解决方案:

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