代码之家  ›  专栏  ›  技术社区  ›  mikelong

有没有办法让这个perl代码从tcsh捕获stderr和stdout?

  •  1
  • mikelong  · 技术社区  · 14 年前
        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常见问题的讨论,但这与bash有关: http://www.perl.com/doc/FAQs/FAQ/oldfaq-html/Q5.15.html

    4 回复  |  直到 14 年前
        1
  •  2
  •   tsee    14 年前

    我建议你用 Capture::Tiny 来自CPAN的模块。它小巧、简单,而且经过了很好的测试。它有一个优雅的API,如果你完全没有任何依赖性,它可以很容易地嵌入到你的程序中。

    除此之外:如果您对正在运行的测试程序有任何控制,我建议您调查 Test Anything Protocol . 如果您可以让您的测试程序输出TAP,那么您的用例(包括良好的测试摘要)就变得非常简单:

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

    注意:关于第二段:可能是最近的测试::需要线束。另外,它并不能完全满足您对shell调用的需求,但是它应该可以让您更接近它。

        2
  •  1
  •   BillThor    14 年前

    打开单元测试仪,qq(tcsh-c“gpath$dir/$tsttgt;bin/rununittests 2>&1”|);

        3
  •  1
  •   Jonathan Leffler    14 年前

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

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

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

        4
  •  0
  •   mikelong    14 年前

    多亏了比尔索尔,我偶然发现了一个解决方案:

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