在Bash環境中,我有一個命令,我想檢測它是否失敗。
然而,它并沒有優雅地失敗:
在Bash環境中,我有一個命令,我想檢測它是否失敗。
# ./program.
do stuff1
do stuff2
錯誤!
do stuff3
# echo $?
0
當它運行時沒有錯誤(成功運行),它回傳的是0。當它運行到一個錯誤時,它可以
- 以
0回傳。 - 以
1回傳,很容易被發現 。
- 以
0回傳,但在運行程序中會列印出一些錯誤資訊 。
我想在一個腳本中使用這個程式,目標是:
- 我需要輸出正常地列印到stdout(而不是在它完成后立即列印!)
- 我需要捕捉到的錯誤資訊。
- 我需要通過
$?或類似的方式來捕捉輸出的回傳值 。
- 我需要
grep在輸出中尋找 "error "字串,并在出現時設定一個變數 。
我想在一個腳本中使用這個程式,其目標是:
我想在一個腳本中使用這個程式。
然后我可以通過檢查回傳值和 "錯誤 "輸出來進行評估。
然而,如果我添加tee,它將破壞回傳值。
我已經嘗試了$PIPESTATUS[0]和$PIPESTATUS[1],但似乎并不奏效:
program | tee > (grep -i error)
即使沒有錯誤,$PIPESTATUS[1]總是回傳0(真),因為tee命令是成功的。
那么,在bash中怎么做呢?
uj5u.com熱心網友回復:
#!/usr/bin/env bash
case $BASH_VERSION in
''|[0-3].*|4.[012].*) echo "ERROR: bash 4.3 required" >2; exit 1; 。
esac
exec {stdout_fd}>& 1
if "$@"| tee "/dev/fd/$stdout_fd"| grep -i error > /dev/null; then
echo "發生錯誤(在stdout檢測到)" >&2
elif ( ( ${PIPESTATUS[0]} ) ); then
echo "檢測到錯誤(通過退出狀態)" >&2
else
echo "沒有發生錯誤" >&2
Fi
測驗如下:
$ myfunc() { echo "this is an ERROR"; return 0; }; export -f myfunc
$ ./test-err myfunc
這是一個ERROR
發生了錯誤(在stdout上檢測到)。
$ myfunc() { echo "Everything is not so fine"; return 1; }; export -f myfunc
$ ./test-err myfunc
一切都不那么好
檢測到的錯誤(通過退出狀態)
$ myfunc() { echo "Everything is fine"; }; export -f myfunc
$ ./test-err myfunc
一切都很好
沒有發生錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308007.html
標籤:
