При запуске 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
завершиться с ошибкой с ненулевым кодом выхода?
Вы можете создать скрипт 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 ( Err: или E: и т. Д.) Для ошибок или с W для предупреждений. Оба возвращают код состояния , ошибка .
Если ошибки нет и есть Get: , это означает, что мы обновляем наши репозитории. Возвращает код состояния отремонтировано .
И, наконец, если мы не сталкивались ни с одним из них, сценарий был успешным .
Как упомянул @Terrance, этот вопрос очень близок к тому другому вопросу apt-get update exit status (в Unix и Linux StackExchange).
К вашему сведению, я только что опубликовал там другое решение , которое также можно комбинировать с командой travis_retry
Travis CI (которая может быть предполагаемым вариантом использования 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