Shell
為已安裝的 debian 包編寫測試腳本 - 錯誤處理?
我想為正在安裝的 debian 包編寫測試腳本。
如果沒有匹配的包,使用
dpkg-query
, 搜尋將返回錯誤。但是,如果我想專門檢測到這一點,併中止任何其他錯誤(例如資源耗盡),我不知道該怎麼做。
dpkg-query 很簡單,你可以快速瀏覽一下手冊頁,發現它沒有直接實現這個的選項。所以
dpkg-query -W -f '${Package} ${State}\n' | grep "^my-package .* installed"
然後問題就歸結為在管道中擷取錯誤程式碼。顯然,Unix shell 中嚴格的錯誤處理變得很尷尬。我天真地希望單行:)。
set -e function pkg_is_installed() { PKG="$1" LISTF=$(mktemp) dpkg-query -W -f '${Package} ${State}\n' >$LISTF grep "^${PKG} .* installed$" $LISTF >/dev/null GREP_RC=$? rm $LISTF # for even moar strict error handling test $GREP_RC == 0 -o $GREP_RC == 1 return $GREP_RC }
我相信這將列印 stderr 發生的任何錯誤,同時避免在唯一的“錯誤”是 dpkg 尚未(尚未)看到請求的包時列印消息。
dpkg-query
確實可以選擇執行此操作,並且其退出程式碼支持您的案例:
-s
,--status
package-name...
報告指定包的狀態。這僅顯示已安裝包狀態數據庫中的條目。當
package-name
列出多個時,請求的狀態條目由空行分隔,其順序與參數列表中指定的順序相同。(請注意,它會在已安裝的包狀態數據庫中查找,因此它無法報告任何未安裝的內容——這就是您所追求的);和
退出狀態
0:請求的查詢已成功執行。
1:請求的查詢完全或部分失敗,因為沒有找到文件或包(除了
--control-path
,--control-list
並且--control-show
此類錯誤是致命的)。2:由於無效的命令行使用或與系統的互動(例如訪問數據庫、記憶體分配等)導致的致命或不可恢復的錯誤。
(Debian 8 中包含的手冊頁沒有提及這一點,但
dpkg-query
即使在 Debian 8 中也確實如此。)所以像
#!/bin/sh dpkg-query -s package > /dev/null 2>&1 case $? in 0) echo $1 is installed ;; 1) echo $1 is not installed ;; 2) echo An error occurred ;; esac
據我了解,(變成一個函式)符合要求。