Три грабли в bash-скриптах

1. Скрипт-патч, который «успешно» ничего не сделал

Скрипт ищет якорь в файле, подставляет замену и в самом конце записывает результат. Если якорь не совпал, запись всё равно происходит — тем же содержимым, — а на экран печатается бодрое «готово». Файл не изменился, а вы уверены в обратном.

Лечится проверкой числа совпадений до записи: не нашли ожидаемое количество — выйти с ошибкой.

2. Резервные копии, затирающие друг друга

cp file "file.bak_$(date +%Y-%m-%d_%H%M)"

Метка времени с точностью до минуты. Два запуска подряд — и вторая копия молча перезаписала первую, ровно ту, которая была нужна. Секунды в имени обязательны.

3. Рабочий каталог, который не сохраняется

Когда команды идут по одной через внешний вызов, каждая стартует в исходном каталоге. cd из предыдущей команды не переносится. Писать полные пути либо связывать в одну строку:

cd /opt/app && ./run.sh
Общее правило ко всем трём: скрипт должен падать там, где что-то пошло не так, а не доезжать до конца с рапортом об успехе. set -euo pipefail в первой строке закрывает изрядную часть подобных историй.