zsh
は、コマンドが与えられたすべてのファイルを破壊できると仮定すると、
>*
オプションnoclobber
を設定することをお勧めします。
いつでも>| file
bashとzshの両方でデフォルトのClobber動作を使用する場合。 (zshでは、代替構文>!file
)。
POSIXの互換性のため、noclobber
はデフォルトで設定解除されていると思いますが、念のため:
noclobber
を設定することの欠点はありますか?
とにかくnoclobber
をインタラクティブシェルにのみ設定する方法はありますか?
noclobber
がデフォルトで設定されていない理由は、伝統です。ユーザーインターフェースの設計の問題として、「この新しいファイルを作成する」ことを簡単なアクションにして、「新しいファイルを作成するか、既存のファイルを上書きする」というより危険なアクションを追加することをお勧めします。したがって、noclobber
は良いアイデアであり(>
は新しいファイルを作成し、>|
は既存のファイルを上書きする可能性があります)、シェルが設計されている場合はデフォルトである可能性があります数十年後。
対話型のシェルスタートアップファイル(.bashrc
または.zshrc
)で以下を使用することを強くお勧めします。
set -o noclobber
alias cp='cp -i'
alias mv='mv -i'
いずれの場合(リダイレクト、コピー、移動)でも、既存のデータを消去することが操作の主な目的ではない場合でも、操作によって既存のデータを消去する副作用が生じる可能性がある場合は、さらにハードルを追加することが目標です。データの消去がrm
の主な目的であるため、このリストにはrm -i
を含めません。
noclobber
と-i
はセーフティネットであることに注意してください。それらがトリガーした場合、あなたは何か間違ったことをした。したがって、上書きするものをチェックしない言い訳として使用しないでください。ポイントは、出力ファイルが存在しないことを確認する必要があるということです。 file exists: foo
またはoverwrite 'foo'?
が表示された場合、それは間違いを犯したことを意味し、気分が悪くなり、より注意する必要があります。特に、上書きするように求められた場合にy
と言う習慣をつけないでください(おそらく、エイリアスはalias cp='yes n | cp -i' mv='yes n | mv -i'
でなければなりませんが、 Ctrl+C 出力の見栄えを良くします):上書きするつもりなら、コマンドをキャンセルし、出力ファイルを移動または削除して、コマンドを再度実行します。
これらの安全をトリガーする習慣を身につけないことも重要です。そうすると、ある日、構成のないマシンに移動し、信頼できる保護機能がないためにデータが失われます。そこに。
noclobber
はインタラクティブシェルに対してのみ設定されます。これは、.bashrc
または.zshrc
がインタラクティブシェルによってのみ読み取られるためです。もちろん、スクリプトに影響を与えるような方法でシェルオプションを変更しないでください。スクリプトが壊れる可能性があります。
_~/.bashrc
_(noclobber
の場合)または_~/.zshrc
_(より正確にはbash
の場合は_$ZDOTDIR/.zshrc
_)でzsh
シェルオプションを設定すると、インタラクティブシェルセッションでアクティブになります。
非対話型シェル(スクリプト)はこれらのファイルを読み取りません。
シェルオプションは通常、親シェルから継承されません。
これは、スクリプトが明示的にこれらのファイルを提供しない限り、既存のスクリプトの動作を変更せずにそれらのファイルでオプションを設定できることを意味します。
私が見ることができるこのことの唯一の欠点は、少なくとも最初は、オプションを設定したことを繰り返し忘れることです。後で、これらすべての種類のものと同様に、実際にファイルを上書きしたくない場合でも、_>|
_を常用し始めます(rm
、cp
、mv
のエイリアスを持つ人々のように、_-i
_オプションは常に設定され、最終的には常にコマンドラインで_-f
_を使用し始めます)。
欠点は、noclobber
をアクティブにすることに慣れた場合、ある日、システムを使用することになりますnotアクティブであり、危険な可能性のあるコマンドを穏やかに実行します。あなたを救うnoclobber
...そして、それはしません。そして、最初に確認を求められると想定していたため、破壊したデータを回復するのに十分な最近のバックアップがあることを期待する必要があります。