apt-get は終了ステータスを更新します。

apt-get は終了ステータスを更新します。

状態を確認する方法はapt-get update

$ apt-get update ; echo "status is: $?"

Err http://security.debian.org stable/updates Release.gpg
Could not resolve 'security.debian.org'
Hit http://192.168.1.100 stable Release.gpg
Hit http://192.168.1.100 stable Release
Hit http://192.168.1.100 stable/main i386 Packages
Hit http://192.168.1.100 stable/contrib i386 Packages
Hit http://192.168.1.100 stable/non-free i386 Packages
Ign http://192.168.1.100 stable/contrib Translation-en
Ign http://192.168.1.100 stable/main Translation-en
Ign http://192.168.1.100 stable/non-free Translation-en
Reading package lists... Done
W: Failed to fetch http://security.debian.org/dists/stable/updates/Release.gpg  Could not resolve 'security.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

status is: 0

セキュリティ更新の取得中にエラーが発生しましたが、終了ステータスは0です。

私の目標は、apt-get updateが正しく実行されていることを確認するスクリプトです。

答え1

これらの警告をエラーに置き換えるには、この適切なオプションを使用してください。

apt-get update -o APT::Update::Error-Mode=any

必要に応じて、confファイルで設定することもできます。

答え2

お客様の例では、apt-get update問題を致命的なエラーではなく警告として扱うため、エラーの終了はありません。致命的なエラーが発生すると、ゼロ以外の状態で終了します。

異常を特定する1つの方法は、次のパターンを確認することですstderr

  • W:次に始まる行
  • E:次に始まる行

apt-get update上記のパターンが一致する場合、または終了コードがゼロでない場合は、次の方法を使用して失敗をシミュレートできます。

if ! { sudo apt-get update 2>&1 || echo E: update failed; } | grep -q '^[WE]:'; then
    echo success
else
    echo failure
fi

!パターンが一致すると、つまりエラーがあると正常に終了するためifです。grepエラーがないとgrep自動的に失敗します。したがって、if条件は負の終了コードですgrep

答え3

apt-getのout / errを食べたくない場合(たとえば、ログファイルに書き込む場合)、これはより簡単なオプションです。

sudo apt-get update 2>&1 | tee /tmp/apt.err && ! grep -q '^[WE]' /tmp/apt.err

後で削除したい新しいファイルを残さないといいでしょうが、grepをtee出力に置き換えると、終了コードを取得するのが難しいようです。

答え4

特殊変数 $? を使用して、最後のコマンドの終了ステータスを確認できます。エラー出力を最初に標準出力にリダイレクトすることもできます。

OUTPUT=`apt-get update 2>&1`

if [[ $? != 0 ]]; then
  echo "$OUTPUT"
fi

関連情報