有沒有辦法根據命令的錯誤輸出執行 if 陳述句?
例如,我想udisksctl在安裝 USB 驅動器然后對驅動器內容執行一些操作的腳本中使用。
- 驅動器未安裝:它應該安裝它,然后執行操作。
- 驅動器不存在:它應該拋出錯誤訊息并退出;
- 驅動器已經安裝,它應該執行操作;
udisksctl在這種情況下,運行可能會產生三種結果:
在第 1 種情況下,它運行成功。
在其他兩種情況下,它回傳一個錯誤,但是:
- 在情況 2) 中,它給了我錯誤:
Error looking up object for device ... - 在情況 3) 中,它給了我錯誤:
Error mounting /dev/sdb1: GDBus.Error:org.freedesktop.UDisks2.Error.AlreadyMounted: Device /dev/sdb1 is already mounted at
有沒有一種優雅的方式來制作一個 if 陳述句,根據這兩個錯誤訊息采取不同的操作?
像這樣將錯誤訊息通過管道傳遞給 grepudisksctl mount -b /dev/disk/by-label/CRUZER 2> >(grep -i "Error looking up object for device")似乎對輸出沒有影響。
uj5u.com熱心網友回復:
錯誤訊息文本上的分支很脆弱;文本可能會在版本之間發生變化,或者您可能會收到類似但含義不同的訊息,或者輸出可能會根據用戶的區域設定更改為不同的語言。但是要按照您的要求進行操作,請嘗試
if result=$(udiskctl mount -b /dev/disk/by-label/CRUZER 2>&1); then
: success
else
rc=$?
case $result in
*"Error looking up object for device"*)
echo case 2;;
*"Error mounting /dev/sdb"*)
echo case 3;;
*) echo "$0: unexpected error $result" >&2
exit $rc
;;
esac
fi
的case內部的if是一個位沒有吸引力; 我想你可以重構它來使用,elif但是你必須重構從失敗的命令中捕獲退出代碼(假設你關心退出代碼是什么)。
顯然,您可以使搜索字串或多或少具體;我試圖讓它們相當一般。
uj5u.com熱心網友回復:
感謝@markp-fuso,這就是我得到的:
udtmp=$(mktemp /tmp/$(basename "$0".XXXXXXXX))
udisksctl mount -b /dev/disk/by-label/CRUZER 2> $udtmp
if grep -i "Error looking up object for device" $udtmp ; then
exit
elif grep -i "GDBus.Error:org.freedesktop.UDisks2.Error.AlreadyMounted" $udtmp ; then
do something
fi
do something else
@LMC 謝謝你的提醒。我想無論如何我都會使用它,因為udiskctl與 Thunar一起使用效果很好,而且mnt更少。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/336535.html
