Есть ли какие-то недостатки настройки `NOCLOBBER`?

) Проблема в том, что при выполнении bash -c '....' , вы создаете неинтерактивный (и не входящий в систему) сеанс bash , который не будет источником какого-либо файла конфигурации времени выполнения, например ~ / .bashrc .

Поскольку вы определили псевдоним в ~ / .bashrc , вы можете использовать -i параметр, чтобы bash мог имитировать интерактивную среду и, следовательно, источник файл ~ / .bashrc :

bash -ic '....'

Теперь псевдоним должен

Пример:

$ alias l
alias l='ls'

$ bash -c 'l'
bash: l: command not found

$ bash -ic 'l'
bar  foo
20
01.07.2018, 14:56
3 ответа

Установка параметра оболочки noclobberв~/.bashrc(дляbash)или~/.zshrc(или, точнее, $ZDOTDIR/.zshrc, дляzsh)сделает его активным в интерактивных сеансах оболочки.

Не интерактивные оболочки -(сценарии )не читают эти файлы.

Параметры оболочки обычно не наследуются от родительских оболочек.

Это означает, что вы должны иметь возможность установить параметр в этих файлах, не изменяя поведение существующих скриптов, если только скрипты явно не используют эти файлы.

Единственный недостаток, который я вижу, заключается в том, что вы постоянно забываете, что установили параметр, по крайней мере, в начале. Позже, как и во всех подобных вещах, вы начнете привычно использовать >|, даже в тех случаях, когда вы на самом деле не хотите затирать файл (, как люди с псевдонимами для rm, cpи mvс всегда установленной опцией -i, со временем начните всегда использовать -fв командной строке ).

6
27.01.2020, 19:44

Причина, по которой 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читаются только интерактивными оболочками. Конечно, вы не должны изменять параметры оболочки таким образом, чтобы это повлияло на сценарии, так как это может нарушить эти сценарии.

35
27.01.2020, 19:44

Недостатком является то, что если вы привыкнете к тому, что noclobberактивен, вы однажды будете использовать систему, в которой он не активен, и вы беспечно выполните потенциально -опасную команду, ожидая, что noclobberспасет вас... но этого не произойдет. И тогда вам придется надеяться, что есть недавняя -резервная копия, достаточная для восстановления данных, которые вы уничтожили, потому что вы предполагали, что сначала вас попросят подтвердить.

6
27.01.2020, 19:44

Теги

Похожие вопросы