Как я могу получить `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 завершиться с ошибкой с ненулевым кодом выхода?

0
задан 16 January 2018 в 19:41

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 ( Err: или E: и т. Д.) Для ошибок или с W для предупреждений. Оба возвращают код состояния , ошибка .

Если ошибки нет и есть Get: , это означает, что мы обновляем наши репозитории. Возвращает код состояния отремонтировано .

И, наконец, если мы не сталкивались ни с одним из них, сценарий был успешным .

1
ответ дан 16 January 2018 в 19:41

Как упомянул @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
1
ответ дан 16 January 2018 в 19:41

Другие вопросы по тегам:

Похожие вопросы: