#set-euo-pipefail
Что делает `set -euo pipefail` и зачем его ставить первой строкой?
Что отвечать
`-e` - exit при любой ошибке (non-zero exit code). `-u` - exit при использовании unset переменной. `-o pipefail` - exit-code пайплайна равен последнему НЕнулевому, а не последней команды (без него `false | true` это успех). Эти три флага превращают bash из forgiving shell в strict mode, который ловит большинство тихих багов сразу.
Что хотят услышать
Senior должен: - назвать каждый флаг по отдельности и привести пример где он ловит баг (особенно `-u`: typo в имени переменной не вызовет ошибку без него) - сказать что `-e` имеет коварство: `cmd && other` или внутри `if` не вызовут exit при ошибке cmd - это by design - упомянуть `set -x` для трейсинга и `set -E` (errtrace) для наследования trap'ов в функциях - назвать `IFS=$'\n\t'` как четвёртый компонент strict mode (защита от word-splitting на пробелах)
Подводные камни
- ✗ Думать что `set -e` ловит ВСЕ ошибки - нет, в условиях и pipe без pipefail он молчит
- ✗ Использовать unset-переменные через `${VAR:-default}` без знания что это обходит `-u`
- ✗ Не ставить strict mode в production-скриптах - тихий баг ждёт своего часа
Follow-up
- ? Что делает `${VAR:-default}` и почему это работает с `set -u`?
- ? Чем `set -E` отличается от `set -e` для trap-наследования?
- ? Как `pipefail` влияет на exit-code многоступенчатого пайплайна?
Глубина в базе знаний