如何查看状态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 选项将这些警告变成错误:
apt-get update -o APT::Update::Error-Mode=any
如果您愿意,您也可以在conf 文件中进行设置。
答案2
在您的示例中,apt-get update
没有错误退出,因为它将问题视为警告,而不是致命的错误。如果确实存在致命错误,那么它将以非零状态退出。
识别异常的一种方法是检查以下中的这些模式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