インストールされた Debian パッケージのテストスクリプトの作成 - エラー処理?

インストールされた Debian パッケージのテストスクリプトの作成 - エラー処理?

インストールしている 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に発生するすべてのエラーを印刷すると信じています。

関連情報