web-dev-qa-db-ja.com

cpのオプションで--no-clobberというファイルを上書きしないのはなぜですか?

cpは、GNU Foundationのcoreutilsチームによって維持されている、非常に人気のあるLinuxツールです。

デフォルトでは、同じ名前のファイルは上書きされます。ユーザーがこの動作を変更したい場合は、--no-clobberをコピーコマンドに追加します。

   -n, --no-clobber
          do not overwrite an existing file (overrides a previous -i option)

なぜ--no-overwrite

23
Tomas Zubiri

データ操作のコンテキストで「 Clobber 」は、データを上書きして破壊することを意味します。 Unix環境でのファイルのコンテキストでは、Wordは少なくとも1980年代初頭にさかのぼって使用されました。 Csh ありset noclobber設定する>既存のファイルの上書きを拒否するには(後でset -o noclobber ksh93およびその他のshスタイルのシェル)。 GNU coreutilsが追加された場合--no-clobber(2009年)、シェルが使用していたのと同じ語彙を使用しました。

これは実際には標準的な用語だからです。 Wikipedia で説明されているように:

ソフトウェアエンジニアリングでは、ファイルまたはコンピューターのメモリを破壊すると、その内容が上書きされます。用語集ファイルは、クロバリングを次のように定義しています。

上書きするために、通常は意図せずに、「アレイの端から離れてスタックを破壊しました。」積み木、落書き、ゴミ箱を比較し、スタックを粉砕します。

同じページで述べたように、bashや他のシェルでもset -o noclobberまたは同等のもの。これはこの種の標準的な用語にすぎないため、cpの開発者にとっては自然な選択でした。

26
terdon

「クローバー」という用語は、一般的にコンピューティングでよく知られています。

cpの_--no-clobber_/_-n_オプションは2009-01-14にKamil Dudka <[email protected]>( commit on github )によってのみ追加されました。

具体的にはGNUプロジェクト内で、GCCでも使用され、CPU命令またはインラインasmステートメントがレジスタの内容です。したがって、ランダムな選択の英語の単語ではなく、Cで記述されたGNUプロジェクトで作業している人々がGCCからの用語の使用に慣れていることは少なくありません。ドキュメント、または他のGNUそれを使用するプロジェクト開発者から:

  • _(clobber x)_ in GCC-internals machine description files これは、ISAの各命令が行うことをGCCに教えます。(inline-asmと同様の制約)
  • GNU C拡張Asm インラインasm()ステートメントには、インラインasmテンプレートのステップを登録するコンパイラーを指示する「clobber」セクションがあります。このように役に立たない無意味なx86の例:
    asm("xor %eax,%eax; mfence" ::: "eax", "memory", "cc");。例えば SO Q&A これらの用語で関数呼び出し規約について尋ねます。
  • GCC docs for _-fcall-used-_regは、指定されたレジスタが関数呼び出しによって「破壊されている」(つまり、呼び出しを微調整する)ことをコンパイラに伝えると説明しますコンベンション)。 _-fcall-saved-_regまたは_-ffixed-_regとは対照的です。
  • GCC _-Wclobbered_ 警告-「longjmpまたはvforkによって変更される可能性のある変数の警告」 (これが2009年に存在した場合はIDKですが、このWordが他のプログラムのオプション名を含むさまざまなコンテキストでこの種のことを説明するために使用されていることを示しています)。

_--no-clobber_を追加したcoreutilsコミットの作成者であるKamil Dudkaは、GCCの内部構造に精通しています。彼(後で?) GCCプラグインを記述 Cプログラムの正式な検証用。

GCCの内部が彼の名前の選択に影響を与えたかどうか、それが_set noclobber_のような既存のシェルオプション、またはその両方から来たかどうかはわかりません。

おもしろい事実:GNU cpの元の作者は、Torjorn Granlundを含みます gmplibプロジェクト (GNU Multi-Precision)の主な作者であり、GCCの乗法の発明/実装に貢献しましたコンパイル時定数による除算の逆最適化( 1994論文 、スタックオーバーフロー Q&A )。

4
Peter Cordes