noclobber: как запретить Bash случайно перезаписать файл
Обычный оператор:
echo "new config" > config.txt
без предупреждения удалит старое содержимое config.txt.
Для скриптов, где случайная перезапись критичного файла недопустима, в Bash есть режим noclobber.
▪️Включаем его
set -o noclobber
Теперь:
echo "new config" > config.txt
если файл уже существует, завершится ошибкой:
bash: config.txt: cannot overwrite existing file
▪️Проверить состояние
set -o | grep noclobber
Или короткая форма:
set -C
Выключить обратно:
set +C
▪️Но >> продолжает работать
noclobber защищает именно от перезаписи через >:
echo "new line" >> config.txt
добавит данные в конец файла.
▪️А как принудительно перезаписать?
Есть специальная конструкция:
echo "new config" >| config.txt
Оператор >| игнорирует noclobber и разрешает перезапись.
Это удобно, когда защита включена глобально, но конкретный участок скрипта действительно должен заменить файл.
▪️Где это полезно
Например, скрипт генерирует конфигурацию:
set -C
generate_config > /etc/myapp/config.conf
Если файл уже существует, операция остановится вместо того, чтобы молча уничтожить текущую конфигурацию.
▪️Важный нюанс
noclobber не является полноценной защитой от всех способов изменения файла. Это именно настройка shell для оператора >.
Её задача проще: превратить потенциально опасную случайную перезапись в явную ошибку.
▪️Почему это важно
В Bash > выглядит безобидно, но фактически означает «открыть файл на запись и обнулить его». noclobber позволяет добавить дополнительный барьер там, где потеря существующего содержимого недопустима.
BashTex 📱 #bash #linux
Обычный оператор:
echo "new config" > config.txt
без предупреждения удалит старое содержимое config.txt.
Для скриптов, где случайная перезапись критичного файла недопустима, в Bash есть режим noclobber.
▪️Включаем его
set -o noclobber
Теперь:
echo "new config" > config.txt
если файл уже существует, завершится ошибкой:
bash: config.txt: cannot overwrite existing file
▪️Проверить состояние
set -o | grep noclobber
Или короткая форма:
set -C
Выключить обратно:
set +C
▪️Но >> продолжает работать
noclobber защищает именно от перезаписи через >:
echo "new line" >> config.txt
добавит данные в конец файла.
▪️А как принудительно перезаписать?
Есть специальная конструкция:
echo "new config" >| config.txt
Оператор >| игнорирует noclobber и разрешает перезапись.
Это удобно, когда защита включена глобально, но конкретный участок скрипта действительно должен заменить файл.
▪️Где это полезно
Например, скрипт генерирует конфигурацию:
set -C
generate_config > /etc/myapp/config.conf
Если файл уже существует, операция остановится вместо того, чтобы молча уничтожить текущую конфигурацию.
▪️Важный нюанс
noclobber не является полноценной защитой от всех способов изменения файла. Это именно настройка shell для оператора >.
Её задача проще: превратить потенциально опасную случайную перезапись в явную ошибку.
▪️Почему это важно
В Bash > выглядит безобидно, но фактически означает «открыть файл на запись и обнулить его». noclobber позволяет добавить дополнительный барьер там, где потеря существующего содержимого недопустима.
BashTex 📱 #bash #linux