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
答案 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 "|);