Shell

為已安裝的 debian 包編寫測試腳本 - 錯誤處理?

  • November 27, 2016

我想為正在安裝的 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

據我了解,(變成一個函式)符合要求。

引用自:https://unix.stackexchange.com/questions/325594