2013-08-27 62 views
0

考慮以下代碼:爲什麼子進程的狀態爲非零?

set status [catch {eval exec $Executable $options | grep "(ERROR_|WARNING)*" >@ stdout} errorMessage] 

if { $status != 0 } { 
    return -code error "" 
} 

在子進程錯誤的情況下,他們在標準輸出的輸出。但是如果子進程中沒有錯誤,狀態值仍然不爲零。如何避免這一點?

還有一些方法可以使用fileutil::grep而不是bash grep?

+0

咦?如果沒有錯誤,catch應該返回'0'...? – Jerry

+0

是的。我認爲是這樣 –

回答

4

如果在子進程中發生錯誤,它們會在stdout中輸出。但是,如果子進程中沒有錯誤,則狀態值仍然不爲零。如何避免這一點?

有寫東西的任何文件描述符(包括一個連接到「standadrd錯誤流」),並返回一個非零退出代碼,因爲這些概念完全就單獨作爲一個OS關注之間沒有任何聯繫。一個進程可以根本不執行任何I/O,並返回一個非零的退出代碼(對於Unix守護進程來說,這是一種常見的情況,通過syslog可以記錄所有錯誤,包括錯誤),或者將某些東西寫入其標準錯誤流,當退出—是軟件的一種常見情況,該軟件向其stdout寫入某些有價值的數據,並在請求時提供診斷消息給其stderr

因此,首先確認你的進程沒有寫入其標準錯誤,並使用普通的外殼與非零退出代碼依然存在

$ that_process --its --command-line-options and arguments if any >/dev/null 
$ echo $? 

(這個過程應該打印什麼,echo $?應打印一個非零數)。

如果情況屬實,而你確保過程中不覺得有什麼是錯的,你必須要繼續使用它,並catch處理extended error information it returns —忽略了過程與退出的情況下圍繞已知的退出代碼並傳播其他所有錯誤。

基本上:

set rc [catch {exec ...} out] 
if {$rc != 0} { 
    global errorCode errorInfo 
    if {[lindex $errorCode 0] ne "CHILDSTATUS"} { 
     # The error has nothing to do with non-zero process exit code 
     # (for instance, the program wasn't found or the current user 
     # did not have the necessary permissions etc), so pass it up: 
     return -code $rc -errorcode $errorCode -errorinfo $errorInfo $out 
    } 
    set exitcode [lindex $errorCode 2] 
    if {$exitcode != $known_exit_code} { 
     # Unknown exit code, propagate the error: 
     return -code $rc -errorcode $errorCode -errorinfo $errorInfo $out 
    } 
    # OK, do nothing as it has been a known exit code... 
} 

CHILDSTATUS(和一般的errorCode全局變量)被描述here

相關問題