「cp」が既存のファイルを自動的に上書きするように設計されているのはなぜですか? [閉鎖]

「cp」が既存のファイルを自動的に上書きするように設計されているのはなぜですか? [閉鎖]

cp次のコマンドを使用してテストしました。

$ ls
first.html   second.html  third.html

$ cat first.html
first

$ cat second.html
second

$ cat third.html
third

first.htmlその後、次の場所にコピーしましたsecond.html

$ cp first.html second.html

$ cat second.html
first

ファイルはsecond.htmlエラーなしで自動的に上書きされます。ただし、デスクトップGUIから同じ名前のファイルをドラッグアンドドロップしてこれを実行すると、first1.html自動的にサフィックスが追加されます。これにより、誤って既存のファイルを上書きするのを防ぎます。

cpファイルを自動的に上書きするのではなく、このパターンに従うことはどうですか?

ベストアンサー1

デフォルトの上書き動作はcpPOSIXで指定されています。

  1. source_fileが通常のファイル形式の場合は、次の手順を実行する必要があります。

    3.a. dest_fileが存在し、前のステップで作成された場合、動作は指定されません。それ以外で dest_file がある場合は、次の手順を実行します。

    3.ai -iオプションが適用される場合、cpユーティリティは標準エラーのプロンプトを作成し、標準入力から1行を読み取る必要があります。応答が肯定的でない場合、cp は source_file の処理を​​実行せずに残りのファイルを処理し続けます。

    3.a.ii dest_fileのファイル記述子は、dest_fileをパスパラメータとして使用し、O_WRONLYおよびO_TRUNC Bitwiseを使用するPOSIX.1-2017システムインタフェースボリュームで定義されているopen()関数と同じことを実行します。 OR oflag 引数として使用されます。

    3.a.iii.ファイル記述子を取得しようとして失敗し、-fオプションが有効な場合、cpはPOSIX.1-で定義されているunlink()関数と同じ操作を実行してファイル記述子を取得しようとします。 2017 dest_fileで呼び出されたシステムインターフェイスのボリュームパスパラメータでファイルを削除します。この試みが成功すると、cpはステップ3bに進みます。

POSIX仕様が作成されたときに、基本オーバーライドの動作に関する基本仮定を含む多数のスクリプトがすでに存在していました。これらのスクリプトの多くは、cronジョブやその他のバックグラウンドジョブなど、ユーザーが直接存在せずに実行するように設計されています。行動を変えるとそれらを破壊します。必要に応じて強制オーバーライドオプションを追加するためにこれをチェックして修正することは、利点がほとんどない厳しい作業と見なすことができます。

さらに、Unixコマンドラインは、初心者の学習曲線を犠牲にしても経験豊富なユーザーが効率的に作業できるように常に設計されています。ユーザーがコマンドを入力すると、コンピューターはユーザーが推測せずにそのコマンドを意味すると期待します。潜在的に破壊的なコマンドに注意するのはユーザーの責任です。

もともとUnixが開発されたとき、システムは最新のコンピュータに比べてメモリと大容量の記憶領域がほとんどなく、警告やプロンプトを上書きすることは無駄で不要な贅沢と考えられているかもしれません。

POSIX標準が作成されたとき、先例はしっかりと確立され、標準作成者はPOSIX標準の利点をよく知っていました。以前のバージョンとの互換性を壊さない

cpまた、他の人が説明したように、すべてのユーザーはシェルエイリアスを使用するか、代替コマンドを作成して変更して$PATH標準システムコマンドの前に代替コマンドを見つけ、必要に応じてセキュリティを確保することで、これらの機能を自分で追加/アクティブ化できます。

しかし、これを行うと、自分に危険がもたらされることがわかります。cpコマンドが対話的に使用されているときに一方向に実行され、スクリプトから呼び出されたときに別の方法で実行される場合、違いがあることを覚えていない可能性があります。他のシステムでは、自分のシステムの警告やプロンプトに慣れているため、不注意になる可能性があります。

スクリプトの動作がまだPOSIXに準拠している場合は、インタラクティブな使用時にプロンプ​​トに慣れてから、多くのコピーを実行するスクリプトを作成してから、誤って何かを上書きしたことがわかります。

スクリプトがプロンプトを強制的に表示する場合、ユーザーなしでコンテキスト(バックグラウンドプロセスやクローン操作など)で実行されたときにコマンドは何をしますか?スクリプトが中断、中断、または上書きされますか?

中断または中断は、自動的に完了する必要がある操作が完了しないことを意味します。時には上書きしないこと自体も問題を引き起こす可能性があります。たとえば、古いデータを最新のデータに置き換えるのではなく、他のシステムで2回処理することができます。

コマンドラインの強力な機能は、次の事実に由来します。コマンドラインでどのような操作を実行するかがわかったら、スクリプトを作成してそのタスクを自動的に実行する方法を暗黙的に知ることができます。。ただし、インタラクティブに使用するコマンドがスクリプトコンテキストで呼び出された場合でもまったく同じように機能する場合にのみ当てはまります。インタラクティブ使用とスクリプト使用の動作に大きな違いがあると、上級ユーザーを迷惑にする可能性がある認知不調和が発生する可能性があります。

おすすめ記事