Учитывая, что zsh
может заглушить все файлы, заданные командой:
>*
Я думаю, что установка опции noclobber
была бы хорошей идеей.
Я всегда могу использовать, >| file
если я хочу использовать стандартное поведение clobber в bash и zsh. (Zsh также допускает альтернативный синтаксис >!file
).
Я предполагаю, noclobber
что по умолчанию не установлен из-за совместимости с POSIX, но просто чтобы быть уверенным:
Есть ли недостатки в настройке noclobber
?
Есть ли вообще установить noclobber
только для интерактивной оболочки?
rm *
...Ответы:
По
noclobber
умолчанию причина не установлена - это традиция. Что касается дизайна пользовательского интерфейса, хорошей идеей будет сделать «создание этого нового файла» простым действием и добавить дополнительное препятствие более опасному действию «либо создать новый файл, либо перезаписать существующий файл». Таким образомnoclobber
, это хорошая идея (>
создать новый файл,>|
потенциально перезаписать существующий файл), и, вероятно, он был бы по умолчанию, если бы оболочка была разработана несколько десятилетий спустя.Я настоятельно рекомендую использовать следующее в вашем файле запуска интерактивной оболочки (
.bashrc
или.zshrc
):В каждом случае (перенаправление, копирование, перемещение) цель состоит в том, чтобы добавить дополнительное препятствие, когда операция может иметь побочный эффект удаления некоторых существующих данных, даже если удаление существующих данных не является основной целью операции. Я не помещаю
rm -i
в этот список, потому что стирание данных является основной цельюrm
.Обратите внимание, что
noclobber
и-i
являются сетями безопасности . Если они сработают, вы сделали что-то не так . Так что не используйте их как оправдание, чтобы не проверять, что вы перезаписываете! Дело в том, что вы должны были проверить, что выходной файл не существует. Если вам сказалиfile exists: foo
илиoverwrite 'foo'?
это означает, что вы допустили ошибку и вам следует чувствовать себя плохо и быть более осторожным. В частности, не заводите привычку говорить,y
если предложено перезаписать (возможно, псевдонимы должны бытьalias cp='yes n | cp -i' mv='yes n | mv -i'
, но нажатие Ctrl+ Cулучшает вывод): если вы действительно хотели перезаписать, отменить команду, переместить или удалить вывод файл и еще раз введите команду.Также важно не привыкать к срабатыванию этих мер безопасности, потому что если вы это сделаете, однажды вы окажетесь на машине, на которой нет вашей конфигурации, и вы потеряете данные, потому что средства защиты, на которые вы рассчитывали, не действуют. т там.
noclobber
будет установлен только для интерактивных оболочек, поскольку.bashrc
или.zshrc
читается только интерактивными оболочками. Конечно, вы не должны изменять параметры оболочки таким образом, чтобы это могло повлиять на сценарии, так как это может нарушить эти сценарии.источник
rm
есть опция,-I
которую я использую и рекомендую: «запрашивать один раз перед удалением более трех файлов или при рекурсивном удалении; менее навязчиво, чем-i
при сохранении защиты от большинства ошибок»-i
в качестве аргумента по умолчанию для них является отличной идеей, но его следует применять к другим псевдонимам , а не к оригиналам (например, я всегда помещаюalias copy="cp -i"
иalias move="mv -i"
в моем .bashrc). Почему? Из-за сбоя режима. Что происходит, когда вы используете компьютер или другого пользователя, у которого нет псевдонимов cp / mv? Файлы могут быть перезаписаны непреднамеренно (возможно, незамеченными!). Соответствующий режим сбоя с псевдонимом копирования / перемещения: оболочка жалуется, что не распознает команду.-i
аргументы для cp и mv превосходен, но совет повторно использовать имена cp и mv ужасно плох. Это так плохо, что я должен дать ответ отрицательным голосом. Пожалуйста, измените использование других псевдонимов, и я проголосую за него.alias RM='command rm'
, который сказал бы Zsh использовать внешнюю командуrm
вместо псевдонима. Таким образом, вы не должны полагаться на--interactive=never
замену предыдущего-i
.Установка параметра
noclobber
оболочки в~/.bashrc
(дляbash
) или~/.zshrc
(или, точнее$ZDOTDIR/.zshrc
, вzsh
) сделает его активным в сеансах интерактивной оболочки.Неинтерактивные оболочки (скрипты) не читают эти файлы.
Параметры оболочки обычно не наследуются от родительских оболочек.
Это означает, что вы должны иметь возможность установить параметр в этих файлах без изменения поведения в существующих сценариях, если только сценарии явно не получают эти файлы.
Единственный недостаток, который я вижу, это то, что вы будете постоянно забывать, что вы установили опцию, по крайней мере, в начале. Позже, как и все такого рода вещи, вы начнете использовать постоянно
>|
, даже в тех случаях , когда вы на самом деле не хотите , чтобы затирать файл (так же , как люди с псевдонимами дляrm
,cp
иmv
с-i
выбором всегда устанавливается, в конечном счете начинают всегда использовать-f
в командной строке).источник
bash
опции наследуются, если$SHELLOPTS
($BASHOPTS
дляshopt
них) находится в среде (не то, что вы обычно хотели бы сделать, хотя по этой причине).Недостаток является то, что, если вы привыкаете к тому ,
noclobber
активным, вы будете один день использовать систему , где это она не активна , и вы будете беспечно выполнять потенциально-опасные команды, ожидая ,noclobber
чтобы спасти вас ... и это не будет. И тогда вам придется надеяться, что резервных копий достаточно для восстановления уничтоженных данных, поскольку вы предполагали, что сначала вас попросят подтвердить.источник