В shell-скриптах легко случайно перезаписать файл через обычное перенаправление. Особенно если путь собирается из переменных или скрипт запускается в cron.
Например, такая команда всегда перезапишет файл:
echo "ready" > report.txt
Если report.txt уже существовал, старое содержимое пропадёт без предупреждения.
Для защиты можно включить режим noclobber:
set -o noclobber
После этого обычное перенаправление через > не сможет перезаписать существующий файл:
set -o noclobber
echo "ready" > report.txt
Если файл уже есть, shell завершит команду ошибкой. Это полезно для отчётов, lock-файлов, backup-метаданных и любых артефактов, которые нельзя случайно затереть.
Когда перезапись действительно нужна, её можно сделать явно через >|:
echo "ready" >| report.txt
Так в коде сразу видно намерение. Обычный путь защищён, а опасное действие становится заметным.
Часто noclobber используют локально в небольшом блоке:
set -o noclobber
echo "$payload" > "$target"
А если скрипт должен продолжить работу с обычным поведением, режим можно выключить:
set +o noclobber
Важно помнить, что noclobber защищает именно перенаправление shell. Он не мешает программе внутри команды самой открыть файл на запись.
➡️ DevOps Ready | #совет
