apt-get更新退出状态


8

如何检查状态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是否正确运行的脚本。

Answers:


6

在您的示例中,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


1

如果您不希望apt-get的输出/错误被吃掉(例如,如果写入日志文件),这可能是一个更简单的选择:

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

如果这不会留下一个新文件供以后删除,那将是很好的选择,但是,例如,如果我们将grep进程替换为tee输出,则似乎更难获得退出代码。


1

我遇到了同样的问题,我想提出一个依赖的其他解决方案tee(例如@ user4122451的解决方案),但是不创建临时文件,并且如果sudo apt-get update返回一个非零的退出代码而不输出某些内容W:E:Err:字符串:

exec {fd}>&2 # copy stderr to some unused fd
bash -o pipefail -c "sudo apt-get update -y -q 2>&1 | tee /dev/fd/$fd | ( ! grep -q -e '^Err:' -e '^[WE]:' )"
result=$?
exec {fd}>&- # close file descriptor

特别地,此解决方案依赖于set -o pipefailbash选项(确保管道返回最右命令的值以非零状态(否则为零)退出)并使用附加编号的文件描述符(另请参见此SO答案)。

如果不需要将该pipefail选项设置为本地,则也可以编写以下内容:

set -o pipefail
exec {fd}>&2 # copy stderr to some unused fd
sudo apt-get update -y -q 2>&1 | tee /dev/fd/$fd | ( ! grep -q -e '^Err:' -e '^[WE]:' )
result=$?
exec {fd}>&- # close file descriptor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.