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

我試圖重定向標準錯誤使用此語法到標準輸出,但它沒有工作:有沒有辦法讓這個Perl代碼捕獲stderr以及tcsh的stdout?

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

我也看到了有關perl的常見問題的討論,但是,這是相對於擊:http://www.perl.com/doc/FAQs/FAQ/oldfaq-html/Q5.15.html

回答

1

嘗試重定向手柄2(stderr)以處理1(stdout),如下所示。 (tcsh -c「gpath $ dir/$ tsttgt; bin/rununittests 2> & 1」|);打開UNIT_TESTER,qq(tcsh -c「gpath $ dir/$ tsttgt; bin/rununittests 2> & 1」|);打開UNIT_TYPE,

+0

這是Bourne/Korn/POSIX/Bash shell符號;除非它有一個嚴肅的改造,否則不是'tcsh'。 – 2010-06-08 07:08:12

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符號。請注意,除非您非常小心,否則最終只會得到第二個命令的錯誤輸出,而不是第一個命令的錯誤輸出。

+0

不幸的是我實際上需要在tcsh中運行這些命令。 – mikelong 2010-06-08 07:19:32

+1

@mikelong:如果您認爲它必須是tcsh,那麼您需要發送以查找[C Shell編程被認爲有害](http://www.faqs.org/faqs/unix-faq/shell/csh-爲什麼不/)。另外,小心一點,你可以使用:'qq(tcsh -c「sh -c'{...;} 2> &1'"|_;''使用'tcsh'運行'sh'來捕獲輸出。 ,你也可以在那裏使用'exec' – 2010-06-08 07:28:35

0

感謝BillThor我偶然發現了一個解決方案:

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

這是否會從'gpath'命令中捕獲錯誤? – 2010-06-08 07:25:17

+0

不,它實際上不是,但實際上我只需要第二個命令的輸出。 – mikelong 2010-06-08 08:10:08

2

我會建議你做CPAN裏Capture::Tiny模塊的捕捉。它很小,很簡單,而且測試得很好。它有一個優雅的API,如果你完全不能有任何依賴,它可以很容易地嵌入到你的程序中。

除此之外:如果您對正在運行的測試程序有任何控制權,我會建議您調查Test Anything Protocol。如果你可以讓你的測試程序輸出抽頭,那麼你的使用情況,包括測試的一個很好的總結成爲簡單:

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

NB約第二段:潛在最近測試::線束所需。另外,對於shell調用,你不太需要做什麼,但它應該讓你足夠接近。

相關問題