Я пытаюсь осмыслить 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