如何让“apt-get update”在其退出代码中反映错误状态?

如何让“apt-get update”在其退出代码中反映错误状态?

跑步的时候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 表示警告。两者都返回状态代码错误

如果没有错误,并且有得到:,这意味着我们更新了我们的仓库。它返回状态代码已修复

最后,如果我们没有遇到上述任何情况,那么脚本就是成功

相关内容