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

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

cpGNU 財団の coreutils チームによって管理されている、非常に人気のある Linux ツールです。

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

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

のような感じはどうでしょうか--no-overwrite?

答え1

クロバーデータ操作の文脈における「上書き」は、データを上書きして破壊することを意味します。Unix 環境のファイルの文脈では、この言葉は少なくとも 1980 年代初頭には使用されていましたが、それ以前に使用されていた可能性もあります。チェコ語既存のファイルを上書きしないようにset noclobber設定する必要がありました(後のksh93やその他のshスタイルのシェル)。>set -o noclobberGNU coreutils を追加 --no-clobber(2009年)、彼らは貝が使用していたのと同じ語彙を使用しました。

答え2

これは実際には標準的な用語です。ウィキペディア:

ソフトウェア工学において、ファイルやコンピュータのメモリを上書きするということは、その内容を上書きすることを意味します。Jargon Fileでは、上書きを次のように定義しています。

通常は意図せずに上書きすること。「配列の最後を歩き回ってスタックを破壊しました。」 mung、scribble、trash、smash the stack を比較してください。

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

答え3

「clobber」という用語は、コンピューティング全般ではよく知られています。

--no-clobber/オプション-nは、cp2009-01-14 に Kamil Dudka によって追加されました <[メールアドレス]> (githubにコミットする)。

特にGNUプロジェクトでは、GCCでも使用されています。CPU 命令またはインライン asm 文がレジスタの内容を破壊することを表します。したがって、これはランダムに選ばれた英語の単語ではなく、C で書かれた GNU プロジェクトに取り組んでいる人々が、GCC ドキュメントや他の GNU プロジェクト開発者が使用している用語から、この用語の使用法に少なくとも何となく慣れている可能性は低いとは言えません。

  • (clobber x)GCC 内部マシン記述ファイルISA 内の各命令が何をするかを GCC に教える。(inline-asm と同様の制約)
  • GNU C 拡張アセンブリインラインasm()ステートメントには、インラインアセンブリテンプレートがどのレジスターを踏むかをコンパイラーに伝えるための「clobber」セクションがあります。この役に立たない無意味なx86の例のように:
    asm("xor %eax,%eax; mfence" ::: "eax", "memory", "cc");。例えば、Q&Aについてそのような観点から関数呼び出し規約について質問します。
  • GCC ドキュメントのために-fcall-used-regこれは、特定のレジスタが関数呼び出しによって「破壊される」ことをコンパイラに伝える(つまり、呼び出し規約を微調整する)と説明できます。-fcall-saved-regまたは-ffixed-reg
  • 湾岸協力会議-Wclobberedwarning - 「longjmp または vfork によって変更される可能性のある変数について警告します。」 (2009 年にこれが存在していたかどうかはわかりませんが、この単語が他のプログラムのオプション名を含むさまざまなコンテキストでこの種のことを説明するために使用されることを示しています)。

を追加した coreutils コミットの作者である--no-clobberKamil Dudka は、間違いなく GCC の内部に精通しています。彼 (後になって?)GCCプラグインを書いたC プログラムの形式検証用。

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

おもしろい事実: GNUのオリジナルcpの作者には、gmplib プロジェクト(GNU Multi-Precision)、およびコンパイル時定数による除算のGCCの逆乗最適化の発明/実装に貢献した人物(1994年の論文、 スタックオーバーフロー質疑応答)。

関連情報