我通過sed爲長時間運行的構建過程輸出語法突出顯示,作爲「mvn」的包裝實現。通過sed管道輸出,但保留退出狀態
此外,我有一個「監視器」腳本,在構建完成時通知我桌面上。監視腳本檢查其參數的退出狀態並報告「成功」或「失敗」。
通過通過sed管道輸出maven,退出狀態總是「ok」,即使構建失敗。
我怎樣才能通過sed傳遞正確的退出狀態呢?
有替代品嗎?
我通過sed爲長時間運行的構建過程輸出語法突出顯示,作爲「mvn」的包裝實現。通過sed管道輸出,但保留退出狀態
此外,我有一個「監視器」腳本,在構建完成時通知我桌面上。監視腳本檢查其參數的退出狀態並報告「成功」或「失敗」。
通過通過sed管道輸出maven,退出狀態總是「ok」,即使構建失敗。
我怎樣才能通過sed傳遞正確的退出狀態呢?
有替代品嗎?
一個星期後,我得到了一個解決方案:
本來我wwanted做
monitor "mvn blah | sed -e SomeHighlightRegEx"
其中顯示器將在sed的(而不是MVN)退出狀態反應。
這是容易做到
monitor "mvn blah" | sed -e SomeHiglightRegEx
注意,該管顯示器通過輸出的sed,同時監控腳本上MVN的狀態反應。
無論如何感謝其他想法。
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單線程中,據我所知)
也許PIPESTATUS變量可以提供幫助。
這是一個衆所周知的後方疼痛。如果你正在使用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的返回值。
如果使用Bash,可以選擇使用set -o pipefail
選項,但由於它依賴於bash,因此它不是可移植的,除非將整個東西包裝在bash env中,否則它將不能用於crontab
。解)。
http://bclary.com/blog/2006/07/20/pipefail-testing-pipeline-exit-codes/
也許你可以使用命名管道?這裏有一個例子:
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
但是,只有在產生整個輸出後纔會執行正則表達式替換,而不是以流式「sed」方式,對嗎?我的PERL知識已相當廢棄...... – Bastl 2011-02-11 11:57:42
完全可能的是,您也可以在perl中讀取循環(),只要您有一些讀取循環,並且只要您有一些讀取循環,並且沒有行就可以回退。 。如果這聽起來很合理,我可以幫你寫一些東西(期望它小於五行!) –
2011-02-11 13:13:01