Выбор ответа Senior Bash-скрипты обновлено

set -e и local

Вопрос

Скрипт начинается с set -e. Почему функция не прерывается, когда curl падает?

fetch() {
  local body=$(curl -fsS https://api.example.com)
  echo "$body"
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Код строки это код команды local, он успешен и маскирует ошибку. У строки local x=$(cmd) код возврата от local, а не от cmd.

Варианты ответа

  1. set -e не действует внутри функций, только на верхнем уровне скрипта
  2. curl -f при HTTP-ошибке всё равно возвращает код 0, а не ошибку
  3. Код строки это код команды local, он успешен и маскирует ошибкуправильный ответ
  4. Подстановка $(...) выполняется в фоне, и её код не проверяется

Разбор

У строки local x=$(cmd) код возврата от local, а не от cmd. Правильно разделять: local body; body=$(curl ...). set -e в функциях работает (кроме вызова в условии), curl -f как раз возвращает 22 при HTTP-ошибке, подстановка выполняется синхронно. Ловушку ловит shellcheck (SC2155).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.