set -euo pipefail: где он не спасает

Строгий режим ловит многое, но у него есть известные ловушки.

· 2 мин

set -euo pipefail в начале скрипта — хорошая привычка. Но у строгого режима есть места, где он ведёт себя неожиданно.

local прячет ошибку

f() { local v=$(false); echo "дошли"; }

Код возврата здесь — от local, а не от подстановки, поэтому скрипт не остановится. Лечится объявлением и присваиванием отдельными строками.

grep без совпадений — это ошибка

grep возвращает 1, если ничего не нашёл, и с -e скрипт завершится. Если отсутствие совпадений нормально, нужен || true.

Арифметика с нулём

i=0; ((i++))   # выражение равно 0 → код 1 → выход

Безопаснее писать i=$((i + 1)).

Строгий режим не заменяет проверок, но делает молчаливые сбои громкими, а это главное.

logbookdev — записки инженера эксплуатации. Нашли неточность или знаете способ лучше — значит, будет следующая запись.

Ещё по теме

Архив →