インストールしている Debian パッケージのテストスクリプトを作成したいと思います。
一致するパッケージがない場合をdpkg-query
使用して検索すると、エラーが返されます。しかし、これを具体的に検出し、他のエラー(リソースの消耗など)が発生した場合、中断したい場合はどうすればよいかわかりません。
答え1
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
(関数になるもの)は私が理解したものと一致します。
答え2
dpkg-queryは非常に簡単で、マンページを少し見てみると、この機能を直接実装するオプションがないことがわかります。だから
dpkg-query -W -f '${Package} ${State}\n' | grep "^my-package .* installed"
これにより、問題は次のように単純化されます。パイプラインでエラーコードをキャプチャ。明らかに、Unixシェルの厳格なエラー処理は厄介です。私は素朴に気の利いた言葉を聞くことを望みました:)。
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
}
dpkgがまだ要求されたパッケージを見ていないことが唯一の「エラー」である場合、メッセージの印刷を避けながら、これがstderrに発生するすべてのエラーを印刷すると信じています。