Назад | Перейти на главную страницу

Функция Bash, возвращаемое значение и обработка ошибок

Я пытаюсь осмыслить Bash и думаю, что зашел довольно далеко. Чего я действительно еще не понимаю, так это обработки ошибок ...

У меня есть такой сценарий:

set -e
set -u

DOWNLOADED_ARTIFACT=$(downloadApplication "$WEB_GROUP")
if [[ $? != 0 ]]; then
  exit 1
fi

Несмотря на то, что функция downloadApplication терпит неудачу (мой ожидаемый результат сейчас), сценарий НЕ терпит неудачу. Я не могу понять, как это проверить при записи вывода в переменную. Если я не верну его в переменную, он заработает и не сработает, как ожидалось:

downloadApplication "$WEB_GROUP"
if [[ $? != 0 ]]; then
  exit 1
fi

Какие у меня варианты? Спасибо.

Как насчет этого?

DOWNLOADED_ARTIFACT=$(downloadApplication "$WEB_GROUP" || echo "SomeErrorString")
if [ $DOWNLOADED_ARTIFACT == "SomeErrorString" ]; then
  exit 1
fi

Это означает "если downloadApplication не удается, затем эхо SomeErrorString" (Так что ваши DOWNLOADED_ARTIFACT будет установлен на SomeErrorString. Затем вы можете сравнить это значение.

Команда DOWNLOADED_ARTIFACT=$(downloadApplication "$WEB_GROUP") всегда будет успешным, потому что то, что важно для $? - это присвоение переменной, которое (почти) гарантированно будет успешным, либо с присвоением 0 или 1 к DOWNLOADED_ARTIFACT.

Ваша обработка ошибок отлично работает для меня. Фактически, с set -e сценарий завершается в строке выполнения и назначения, поскольку результат не проверяется. Ты уверен что downloadApplication выходит с правильным кодом выхода? Попробуйте выполнить downloadApplication "$WEB_GROUP"; echo $? прямо в командной строке.

Кстати, вы можете проверить код возврата и записать вывод в одном операторе:

if ! DOWNLOADED_ARTIFACT=$(downloadApplication "$WEB_GROUP"); then
    echo "Download failed"
    exit 1
fi

do_something $DOWNLOADED_ARTIFACT