В Bash каждая команда возвращает код завершения: 1 - успех, ≠0 - ошибка. И вся логика скрипта строится именно на этом.
▪️ Базовый принцип
command
echo $?
Но руками
$? почти не используют, есть удобнее способы.▪️ && - выполняй, если успешно
mkdir dir && cd dir
cd выполнится только если mkdir прошел успешно.▪️ || - выполняй при ошибке
command || echo "Ошибка"
Полезно для fallback-логики.
▪️ Комбинируем
command && echo "OK" || echo "FAIL"
Но тут есть нюанс:
Если
echo "OK" упадет (редко, но возможно), сработает || и ты получишь ложный FAIL.Поэтому для критичной логики лучше:
if command; then
echo "OK"
else
echo "FAIL"
fi
▪️ set -e - автоматический выход при ошибке
set -e
Теперь скрипт завершится при любой ошибке. Но есть подводные камни:
set -e
grep "foo" file.txt
echo "done"
Если grep ничего не найдёт - exit code = 1 и скрипт завершится. Иногда это нормальное поведение, а не ошибка.
▪️ Правильное использование set -e. Обычно пишут так:
set -euo pipefail
Но при этом явно обрабатывают исключения:
grep "foo" file.txt || true
Или:
if grep -q "foo" file.txt; then
echo "Found"
fi
▪️ pipefail - важно для пайпов
set -o pipefail
Без него:
false | true
echo $? # → 0
С pipefail:
false | true
echo $? # → ошибка
▪️ Общие правила:
&& - для цепочек успеха|| - для fallbackif - для сложной логикиset -e - осторожноpipefail - почти всегда включатьBashTex 📱 #bash