2014-10-28 70 views
2

我想使用一個小腳本對我的gcc的輸出做一些整容工作。在管道中傳播退出狀態

所以我用這個命令:

mygcc foo.c 2>&1 | myscript.pl 

基本上我的腳本做這樣的事情:

$error = 0; 
while(<>) 
{ 
    s/^"(.*)"\s*,\s*line\s*(\d+)\s*:\s*(cc\d+)\s*:/colored("[$3]", 'bold red').colored(" $1", 'red').":".colored("$2", 'yellow')/ge; 
    s/ \^/colored(" ^", 'yellow')/e; 
    s/(error:.*$)/colored($1, 'red')/ge; 
    s/(warning.*$)/colored($1, 'yellow')/ge; 
    print; 
    $error = -1; 
}  

不幸的是,從GCC退出代碼是不正確通過管道傳播。我需要做的是從gcc獲取退出代碼並將其從我的腳本中寫回。

如果沒有這個,make會在錯誤的情況下不會正確地停止構建過程。

我該如何做到這一點?

回答

1

嘗試使用子殼:

(mygcc foo.c; echo "gcc returned $?") |& myscript.pl 

(cmd)結構用於在一個子shell啓動cmd。您當前的shell將自行分叉,並且這些命令將由子shell執行。這是一個簡單的方法來運行多個命令並將輸出提供給管道。

$?變量是最後一個命令的退出狀態。

cmd1 |& cmd1構造相當於cmd1 2>&1 | cmd2

0

看看this。然後,您可以使用%ENV變量來訪問gcc返回狀態,並從您的perl腳本中返回該值。