2011-02-11 75 views
2

我通過sed爲長時間運行的構建過程輸出語法突出顯示,作爲「mvn」的包裝實現。通過sed管道輸出,但保留退出狀態

此外,我有一個「監視器」腳本,在構建完成時通知我桌面上。監視腳本檢查其參數的退出狀態並報告「成功」或「失敗」。

通過通過sed管道輸出maven,退出狀態總是「ok」,即使構建失敗。

我怎樣才能通過sed傳遞正確的退出狀態呢?

有替代品嗎?

回答

0

一個星期後,我得到了一個解決方案:

本來我wwanted做

monitor "mvn blah | sed -e SomeHighlightRegEx" 

其中顯示器將在sed的(而不是MVN)退出狀態反應。

這是容易做到

monitor "mvn blah" | sed -e SomeHiglightRegEx 

注意,該管顯示器通過輸出的sed,同時監控腳本上MVN的狀態反應。

無論如何感謝其他想法。

0

Bastil,因爲管道不關心退出狀態,所以只能知道sed是否退出。我將加強sed腳本(或者考慮使用3班輪Perl腳本)以失敗狀態退出,如果沒有找到預期的文本,像僞代碼:

read($stdin) 
if blank 
    exit(1) // output was blank, or on $stderr 
else 
    regular expression substitution here 
end 
// natural exit success here 

你可以做到這一點作爲一個perl單線程,同樣可以在sedscript中完成(但不是在sed單線程中,據我所知)

+0

但是,只有在產生整個輸出後纔會執行正則表達式替換,而不是以流式「sed」方式,對嗎?我的PERL知識已相當廢棄...... – Bastl 2011-02-11 11:57:42

+0

完全可能的是,您也可以在perl中讀取循環(),只要您有一些讀取循環,並且只要您有一些讀取循環,並且沒有行就可以回退。 。如果這聽起來很合理,我可以幫你寫一些東西(期望它小於五行!) – 2011-02-11 13:13:01

1

這是一個衆所周知的後方疼痛。如果你正在使用bash(可能還有很多其他的現代sh變體),你可以訪問PIPESTATUS數組來獲得管道中早些時候的程序的返回值。 (通常,管道的返回值是管道中最後一個程序的返回值。)如果您使用的是沒有PIPESTATUS的shell(或者如果需要可移植性),則可以這樣做:

 
#!/bin/sh 

# run 'echo foo | false | sed s/f/t/', recording the status 
# of false in RV 
eval $({ { echo foo | false; printf RV=$? >&4; } | 
    sed s/f/t/ >&3; } 4>&1;) 3>&1 
echo RV=$RV 

# run 'echo foo | cat | sed s/f/t/', recording the status 
# of cat in RV 
eval $({ { echo foo | cat; printf RV=$? >&4; } | 
    sed s/f/t/ >&3; } 4>&1;) 3>&1 
echo RV=$RV 


在每種情況下,RV將分別包含false和cat的返回值。

0

也許你可以使用命名管道?這裏有一個例子:

FIFODIR=`mktemp -d` 
FIFO=$FIFODIR/fifo 
mkfifo $FIFO 

cat $FIFO &    # An arbitrary pipeline 
if false > $FIFO 
then 
    echo "Build succeeded" 
else 
    echo "Build failed" # This line WILL execute 
fi 

rm -r $FIFODIR