「noclobber」を設定することの欠点はありますか?


19

それzshはコマンドを与えられたすべてのファイルを上書きできることを考えると:

>*

オプションを設定noclobberすることは良い考えだと思います。

>| filebashとzshの両方でデフォルトのclobber動作を使用したい場合はいつでも使用できます。(zshでは代替構文も使用できます>!file)。

noclobberPOSIXとの互換性のため、デフォルトでは設定されていないと思いますが、念のために:

設定のマイナス面はありますnoclobberか?

とにかくnoclobber対話型シェルのみに設定する必要はありますか?


3
zshが少なくとも次のようなことを警告していることを考えると、zshは少なくともそれについて警告していないことに驚いていrm *ます
...-ilkkachu

回答:


23

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私が使用してお勧めしていること:「プロンプトの一回以上の3つのファイルを削除、または再帰的に削除するときに前に、より少ない侵入-i、まだほとんどのミスに対する保護を与えながら」
リード

8
cpとmvをそのように再エイリアスしないことを強くお勧めします。ただし、-iそれらのデフォルト引数として使用することは優れたアイデアですが、オリジナルではなく異なるエイリアス名に適用する必要があります(たとえば、.bashrc に常に配置alias copy="cp -i"alias move="mv -i"ます)。どうして?故障モードのため。cp / mvエイリアスを持たないマシンまたは別のユーザーを使用するとどうなりますか?ファイルは意図せずに上書きされる可能性があります(検出されない可能性があります!)。コピー/移動エイリアスに対応する障害モード:シェルはコマンドを認識しないと文句を言います。
hlovdal

1
cp / mvエイリアスには、追加の失敗モードもあります。シェルスクリプトを作成するとき、cp = "cp -i"エイリアスに慣れている人は、cp名前の違い。対照的に、「copy somefile / some / where」を作成するたびに、cpコマンドではなくエイリアスを使用していることがわかります。また、コピーをシェルファイルに入れたとしても、エイリアスが欠落しているシェルと同じように失敗します。
hlovdal

1
TL; DR -icpとmvの引数を使用するデフォルトのアドバイスは優れていますが、cpとmvの名前を再利用するアドバイスはひどく悪いです。とても悪いので、答えに賛成票を投じなければなりません。別のエイリアス名を使用するように変更してください。これに賛成票を投じます。
hlovdal

1
@TomHale alias RM='command rm'を使用するrmと、エイリアスの代わりに外部コマンドを使用するようにzshに指示できます。そうすれば--interactive=never、以前のものに取って代わる必要はありません-i
アデフォン

6

(for )または(より正確にはfor )でnoclobberシェルオプションを設定すると、インタラクティブシェルセッションでアクティブになります。~/.bashrcbash~/.zshrc$ZDOTDIR/.zshrczsh

非対話型シェル(スクリプト)は、これらのファイルを読み取りません。

シェルオプションは通常、親シェルから継承されません。

これは、スクリプトが明示的にそれらのファイルをソースしない限り、既存のスクリプトの動作を変更せずにそれらのファイルにオプションを設定できることを意味します。

これを行うことの唯一の欠点は、少なくとも最初はオプションを設定したことを繰り返し忘れてしまうことです。その後、すべての物事のこれらの種類のと同じように、あなたは習慣的に使用を開始します>|も、あなたは実際にちょうどの別名を持つ人々のようなファイルを(壊したくないかもしれません場合には、rmcp及びmv-iオプションが常に設定され、最終的には常に使用を開始します-fコマンドラインで)。


2
bash場合のオプションが継承され、$SHELLOPTS$BASHOPTSのためのshoptもの)環境(ないあなたは、一般的な理由のこの種のためにかかわらず、やりたいと思い何か)です。
ステファンシャゼラス

3

欠点は、noclobberアクティブになることに慣れると、いつかアクティブではないシステムを使用し、潜在的に危険なコマンドを穏やかに実行し、noclobberあなたを救うことを期待して...そしてそれはしません。そして、最初に確認を求められると仮定したため、破壊したデータを回復するための十分なバックアップがあることを期待する必要があります。


確かに、いつかアクティブではないシステムを使用します。なじみのないシステムを使用している場合は、出力をファイルにリダイレクトするなどの破壊的な可能性のある操作を行う前に、特に注意してバックアップが最新であることを確認する必要があります。
ジル 'SO-悪であるのをやめる'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.