跑步的时候sudo apt-get update -q
,有时我会看到类似的东西
Err:23 http://ppa.launchpad.net/chris-lea/redis-server/ubuntu precise/main i386 Packages
Could not connect to ppa.launchpad.net:80 (91.189.95.83), connection timed out
Err:24 http://ppa.launchpad.net/chris-lea/redis-server/ubuntu precise/main Translation-en
Unable to connect to ppa.launchpad.net:http:
或者类似
W: http://us-central1.gce.archive.ubuntu.com/ubuntu/dists/precise-updates/InRelease: Signature by key 630239CC130E1A7FD81A27B140976EAF437D05B5 uses weak digest algorithm (SHA1)
但echo $?
告诉我apt-get update -q
成功了。我怎样才能使错误/警告状态为致命的,并apt-get update
以非零退出代码失败?
答案1
正如@Terrance 提到的,这个问题与另一个问题非常接近apt-get 更新退出状态(在 Unix 和 Linux StackExchange 中)。
仅供参考,我刚刚在那里发过帖子另一种解决方案它也可以与 Travis CI 命令结合使用travis_retry
(这可能是 OP 的预期用例):
exec {fd}>&2 # copy stderr to some unused fd
travis_retry bash -o pipefail -c "sudo apt-get update -y -q 2>&1 | tee /dev/fd/$fd | ( ! grep -q -e '^Err:' -e '^E:' )"
exec {fd}>&- # close file descriptor
答案2
您可以创建一个 bash 脚本来检查命令输出:
if { apt-get update 2>&1 || echo E: update failed; } > result.txt; cat result.txt | grep -q '^[(W)|(E]:'; then
echo error
else (
if cat result.txt | grep -q '^[(Get)]:'; then
echo repaired
else
echo success
fi
)
fi
在这里,我们检查一行是否以 E 开头(呃:或者埃:等)表示错误,或用 W 表示警告。两者都返回状态代码错误。
如果没有错误,并且有得到:,这意味着我们更新了我们的仓库。它返回状态代码已修复。
最后,如果我们没有遇到上述任何情况,那么脚本就是成功。