2010-06-08 13 views
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; 

J'ai essayé de rediriger stderr vers stdout en utilisant cette syntaxe, mais il ne fonctionne pas:Existe-t-il un moyen de rendre ce code perl stderr de capture ainsi que stdout d'un tcsh?

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

J'ai lu aussi la discussion sur la FAQ perl mais était en relation avec bash: http://www.perl.com/doc/FAQs/FAQ/oldfaq-html/Q5.15.html

Répondre

1

Essayez de rediriger le handle 2 (stderr) vers le handle 1 (stdout) comme suit.

ouvert UNIT_TESTER, qq (tcsh -c "gpath $ rép/$ tsttgt; bin/rununittests 2> & 1" |);

+0

C'est la notation de shell Bourne/Korn/POSIX/Bash; pas 'tcsh' à moins d'avoir subi une transformation sérieuse. –

1

Deux options (au moins) du printemps à l'esprit:

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

et

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

Le second est un tricheur; il utilise la notation shell Bourne/Korn/POSIX/Bash. Notez que sauf si vous êtes prudent, vous vous retrouvez avec la sortie d'erreur de seulement la deuxième commande et pas de la première.

+0

Malheureusement, j'ai vraiment besoin d'exécuter ces commandes dans tcsh. – mikelong

+1

@mikelong: Si vous pensez que cela doit être tcsh, alors vous devez être envoyé pour rechercher [Programmation shell C considérée comme nuisible] (http://www.faqs.org/faqs/unix-faq/shell/csh- pourquoi pas/). Aussi, avec soin, vous pouvez utiliser: 'qq (tcsh -c" sh -c '{...;} 2> &1'"|_; 'qui utilise' tcsh' pour lancer 'sh' pour capturer la sortie. –

0

Merci à BillThor je suis tombé sur une solution:

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

Est-ce que cela capture les erreurs de la commande 'gpath'? –

+0

Non, mais je n'ai besoin que de la sortie de la deuxième commande. – mikelong

2

Je vous suggère de faire votre capture avec le module Capture::Tiny de CPAN. C'est petit, simple et bien testé. Il a une API élégante et si vous ne pouvez absolument pas avoir de dépendances, il peut être facilement intégré dans votre programme. En dehors de cela: Si vous avez un contrôle sur le programme de test en cours d'exécution, je vous suggère d'examiner le Test Anything Protocol. Si vous pouvez faire votre programme test de sortie TAP, votre cas d'utilisation, y compris un bon résumé des tests devient aussi simple que:

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

NB au sujet du deuxième alinéa: Potentiellement récent test :: Harnais requis. En outre, ne fait pas tout à fait ce dont vous avez besoin en ce qui concerne l'invocation de shell, mais il devrait vous être assez proche.