У bash есть несколько операторов, которые управляют выполнением команд в зависимости от их кода возврата (0 - успех, ≠0 - ошибка). Разница кажется простой, но на практике часто приводит к тому, что люди не совсем понимают, что они используют.
▪️ ; - просто последовательность. Команды выполняются всегда, независимо от успеха/ошибки.
echo "start"; false; echo "end"
# => выведет start, потом end, даже если false упала
Используется, когда важно выполнить все подряд.
▪️ && - только при успехе. Выполнится вторая команда, если первая завершилась успешно (exit code 0).
mkdir data && echo "Папка создана"
Если mkdir упадет (например, папка уже есть), то echo не выполнится.
Полезно для цепочек успеха:
make build && make test && make deploy
▪️ || - только при ошибке. Выполнится, если первая команда завершилась с ошибкой.
ping -c1 host || echo "Хост недоступен"
Удобно для fallback-сценариев.
▪️ Комбинация && … || … Классический паттерн if-else в одну строку:
command && echo "OK" || echo "FAIL"
Подводный камень: если echo "OK" упадет, то выполнится и "FAIL".
Безопасный вариант - скобки:
command && { echo "OK"; } || { echo "FAIL"; }
▪️ ! - инверсия результата. Меняет код возврата команды на противоположный.
! true # вернет 1
! false # вернет 0
Часто встречается в условиях:
if ! grep -q "needle" file.txt; then
echo "Нет совпадений"
fi
Результаты:
; → всегда выполнить
&& → выполнить при успехе
|| → выполнить при ошибке
! → инвертировать результат
&& … || … → if-else, но лучше со скобками для надежности
BashTex 📱 #bash #utils