Чи є недоліки налаштування `noclobber`?


20

З огляду на те, що zshможе клобувати всі файли, задані командою:

>*

Я думаю, що встановлення цього варіанту noclobberбуло б гарною ідеєю.

Я завжди можу використовувати, >| fileякщо хочу використовувати поведінку клоубера за замовчуванням і в bash, і в zsh. (zsh також дозволяє альтернативний синтаксис >!file).

Я здогадуюсь noclobber, що за замовчуванням не встановлено через сумісність POSIX, але просто для переконання:

Чи є якісь недоліки в налаштуванні noclobber?

Чи все-таки потрібно встановити noclobberлише інтерактивну оболонку?


3
Я здивований, що zsh не принаймні попереджає про це, враховуючи, що він попереджає про щось на кшталт rm *...
ilkkachu

Відповіді:


24

Причина 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їх читають лише інтерактивні оболонки. Звичайно, ви не повинні змінювати параметри оболонки таким чином, що впливатиме на скрипти, оскільки це може зламати ці сценарії.


6
rmє варіант, -Iякий я використовую та рекомендую: "підкажіть один раз перед тим, як видалити більше трьох файлів або при рекурсивному видаленні; менш нав'язливий, ніж -iпри цьому все-таки надавати захист від більшості помилок"
Reid

9
Я настійно рекомендую таким чином не повторно створювати cp та mv. Однак використання -iв якості аргументу за замовчуванням для них є чудовою ідеєю, але її слід застосовувати в різних іменах псевдонімів , а не в оригіналах (наприклад, я завжди ставлю alias copy="cp -i"і alias move="mv -i"в моєму .bashrc). Чому? Через режим відмови. Що відбувається, коли ви використовуєте машину або іншого користувача, у якого немає псевдонімів cp / mv? Файли потенційно можуть бути перезаписані ненавмисно (можливо, непоміченими!). Відповідний режим відмови з псевдонімом copy / move: shell скаржиться, що не розпізнає команду.
hlovdal

1
Існує також додатковий режим відмови для псевдоніму cp / mv: коли пише сценарій оболонки, хтось, який використовується для псевдоніму cp = "cp -i", міг написати команду cp неправильно, очікуючи, що вона буде вести себе як в інтерактивному режимі, оскільки немає різниця імен. На відміну від цього, кожного разу, коли я пишу "копіювати якийсь файл / якийсь / де", я знаю, що я використовую псевдонім, а не команду cp безпосередньо. І навіть якщо я повинен помістити копію у файл оболонки, він би пройшов так само, як і для оболонки з відсутнім псевдонімом.
hlovdal

1
Тож TL; DR порада за замовчуванням використовувати -iаргумент для cp та mv - чудова, але порада повторно використовувати імена cp та mv жахливо погана. Це так погано, що я маю дати відповідь вниз. Будь ласка, змініть, щоб використовувати різні імена псевдонімів, і я голосую за нього.
hlovdal

1
@TomHale Ви можете використовувати alias RM='command rm', що скаже zsh використовувати зовнішню команду rmзамість псевдоніму. Таким чином, вам не доведеться покладатися на --interactive=neverвитіснення попереднього -i.
Adaephon

6

Якщо встановити параметр noclobberоболонки в ~/.bashrc(для bash) або ~/.zshrc(точніше $ZDOTDIR/.zshrc, для zsh), він зробить його активним в інтерактивних сесіях оболонок.

Неінтерактивні оболонки (сценарії) не читають ці файли.

Параметри оболонок зазвичай не успадковуються від батьківських оболонок.

Це означає, що ви повинні мати можливість встановити параметр у цих файлах, не змінюючи поведінку в існуючих сценаріях, якщо сценарії явно не джерела цих файлів.

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


2
З bash, опції успадковуються, якщо $SHELLOPTS( $BASHOPTSдля shoptтих) знаходиться в оточенні (не те, що ви, як правило, хочете зробити, хоча з такої причини).
Стефан Шазелас

3

Мінус полягає в тому, що якщо ви звикли до noclobberактивних дій, ви одного разу будете користуватися системою, де вона не активна, і ви будете чудово виконувати потенційно небезпечну команду, розраховуючи, що noclobberвас врятує ... і це не стане. І тоді вам доведеться сподіватися, що існує відносно недавнє резервне копіювання для відновлення зруйнованих даних, оскільки ви припускали, що спочатку вас попросять підтвердження.


Звичайно, одного дня ви будете використовувати систему, де вона не активна. Коли ви користуєтеся незнайомою системою, ви повинні бути особливо обережними та гарантувати, що резервні копії є актуальними, перш ніж робити щось потенційно руйнівне, як перенаправлення виводу у файл.
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.