Есть ли способ заставить этот Perl-код захватывать как stderr, так и stdout из tcsh? - PullRequest
1 голос
/ 08 июня 2010
    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 ]

2 голосов
/ 08 июня 2010

Я бы посоветовал вам сделать захват с помощью модуля Capture :: Tiny из CPAN. Это маленький, простой и хорошо проверенный. У него элегантный API, и если у вас совершенно нет никаких зависимостей, его можно легко встроить в вашу программу.

Кроме того: если у вас есть какой-либо контроль над выполняемой программой тестирования, я бы посоветовал вам исследовать Протокол проверки чего-либо . Если вы можете сделать так, чтобы ваша тестовая программа выводила TAP, тогда ваш сценарий использования, включая краткое изложение тестов, становится простым:

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

Примечание о втором абзаце: возможно, требуется недавний тест :: Проводка. Кроме того, он не совсем делает то, что вам нужно в отношении вызова оболочки, но он должен приблизить вас достаточно близко.

1 голос
/ 08 июня 2010

Два варианта (по крайней мере) приходят на ум:

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. Обратите внимание, что если вы не будете осторожны, вы получите сообщение об ошибке только второй команды, а не первой.

1 голос
/ 08 июня 2010

Попробуйте перенаправить дескриптор 2 (stderr) на дескриптор 1 (stdout) следующим образом.

открыть UNIT_TESTER, qq (tcsh -c "gpath $ dir / $ tsttgt; bin / rununittests 2> & 1" |);

0 голосов
/ 08 июня 2010

Благодаря BillThor я наткнулся на решение:

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