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 选项将这些警告变成错误:

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

相关内容