有没有办法使这个perl代码捕获stderr以及来自tcsh的stdout?

时间:2010-06-08 06:57:43

标签: perl tcsh

    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 个答案:

答案 0 :(得分:2)

我建议您使用CPAN中的Capture::Tiny模块进行捕获。它小巧,简单,经过充分测试。它有一个优雅的API,如果你完全不能有任何依赖,它可以很容易地嵌入你的程序。

除此之外:如果您对正在运行的测试程序有任何控制权,我建议您调查Test Anything Protocol。如果你可以让你的测试程序输出TAP,那么你的用例包括一个很好的测试总结就变得如此简单:

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

关于第二段的注意事项:潜在的最近测试::需要线束。此外,对于shell调用,您不需要做什么,但它应该让您足够接近。

答案 1 :(得分:1)

尝试重定向句柄2(stderr)以处理1(标准输出),如下所示。

打开UNIT_TESTER,qq(tcsh -c“gpath $ dir / $ tsttgt; bin / rununittests 2&gt;&amp; 1”|);

答案 2 :(得分: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表示法。请注意,除非您小心,否则最终只能输出第二个命令而不是第一个命令的错误输出。

答案 3 :(得分:0)

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

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