状態を確認する方法は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