回答:
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
オプションを持っている-I
私が使用してお勧めしていること:「プロンプトの一回以上の3つのファイルを削除、または再帰的に削除するときに前に、より少ない侵入-i
、まだほとんどのミスに対する保護を与えながら」
-i
それらのデフォルト引数として使用することは優れたアイデアですが、オリジナルではなく異なるエイリアス名に適用する必要があります(たとえば、.bashrc に常に配置alias copy="cp -i"
しalias move="mv -i"
ます)。どうして?故障モードのため。cp / mvエイリアスを持たないマシンまたは別のユーザーを使用するとどうなりますか?ファイルは意図せずに上書きされる可能性があります(検出されない可能性があります!)。コピー/移動エイリアスに対応する障害モード:シェルはコマンドを認識しないと文句を言います。
-i
cpとmvの引数を使用するデフォルトのアドバイスは優れていますが、cpとmvの名前を再利用するアドバイスはひどく悪いです。とても悪いので、答えに賛成票を投じなければなりません。別のエイリアス名を使用するように変更してください。これに賛成票を投じます。
alias RM='command rm'
を使用するrm
と、エイリアスの代わりに外部コマンドを使用するようにzshに指示できます。そうすれば--interactive=never
、以前のものに取って代わる必要はありません-i
。
(for )または(より正確にはfor )でnoclobber
シェルオプションを設定すると、インタラクティブシェルセッションでアクティブになります。~/.bashrc
bash
~/.zshrc
$ZDOTDIR/.zshrc
zsh
非対話型シェル(スクリプト)は、これらのファイルを読み取りません。
シェルオプションは通常、親シェルから継承されません。
これは、スクリプトが明示的にそれらのファイルをソースしない限り、既存のスクリプトの動作を変更せずにそれらのファイルにオプションを設定できることを意味します。
これを行うことの唯一の欠点は、少なくとも最初はオプションを設定したことを繰り返し忘れてしまうことです。その後、すべての物事のこれらの種類のと同じように、あなたは習慣的に使用を開始します>|
も、あなたは実際にちょうどの別名を持つ人々のようなファイルを(壊したくないかもしれません場合には、rm
、cp
及びmv
で-i
オプションが常に設定され、最終的には常に使用を開始します-f
コマンドラインで)。
bash
場合のオプションが継承され、$SHELLOPTS
($BASHOPTS
のためのshopt
もの)環境(ないあなたは、一般的な理由のこの種のためにかかわらず、やりたいと思い何か)です。
欠点は、noclobber
アクティブになることに慣れると、いつかはアクティブではないシステムを使用し、潜在的に危険なコマンドを穏やかに実行し、noclobber
あなたを救うことを期待して...そしてそれはしません。そして、最初に確認を求められると仮定したため、破壊したデータを回復するための十分なバックアップがあることを期待する必要があります。
rm *
ます