По noclobber
умолчанию причина не установлена - это традиция. Что касается дизайна пользовательского интерфейса, хорошей идеей будет сделать «создание этого нового файла» простым действием и добавить дополнительное препятствие более опасному действию «либо создать новый файл, либо перезаписать существующий файл». Таким образом noclobber
, это хорошая идея ( >
создать новый файл, >|
потенциально перезаписать существующий файл), и, вероятно, он был бы по умолчанию, если бы оболочка была разработана несколько десятилетий спустя.
Я настоятельно рекомендую использовать следующее в вашем файле запуска интерактивной оболочки ( .bashrc
или .zshrc
):
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
В каждом случае (перенаправление, копирование, перемещение) цель состоит в том, чтобы добавить дополнительное препятствие, когда операция может иметь побочный эффект удаления некоторых существующих данных, даже если удаление существующих данных не является основной целью операции. Я не помещаю 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 *
...