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

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

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

これは実際には標準用語であるからです。説明したようにウィキペディア:

ソフトウェアエンジニアリングでファイルやコンピュータのメモリを破損するのは、その内容を上書きすることです。専門用語ファイルは、破壊を次のように定義します。

上書き(通常は意図しない):「私は配列の終わりから歩いてスタックを破壊しました」緑の芝生、落書き、ゴミ、壊れたスタックを比較します。

同じページで述べたように、bashや他のシェルでもこの​​用語またはset -o noclobber同等の用語を使用します。この種のことを指す標準用語だけですcp

答え3

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

--no-clobber/オプションは2009-01-14にKamil Dudkaによってのみ追加され-nました。 <cp[Eメール保護]>(githubに送信)。

特に、GNUプロジェクトではGCCでも使用されます。CPU命令またはインラインasmステートメントがレジスタの内容を破壊する場合について説明します。したがって、これはランダムに選択された英語の単語ではなく、Cで書かれたGNUプロジェクトに参加している人は、少なくともGCC文書またはこの用語を使用している他のGNUプロジェクト開発者の用語の使用に精通しています。

  • (clobber x)存在するGCC - 内部マシン記述ファイルISA の各命令が実行する操作を GCC に通知します。 (インラインアセンブリと同様の制約)
  • GNU C拡張アセンブリinlineasm()ステートメントには、インライン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によって変更された可能性がある変数について警告します。" .)別のプログラム名で)。

追加されたcoreutilsコミットの作成者であるKamil Dudkaは、間違いなく--no-clobberGCCの内部についてよく知っています。彼は(後で?)GCCプラグインを作成しました。Cプログラムの公式検証のため。

GCCの内部が彼の名前の選択に影響を与えたのか、それともそれが既存のシェルオプション(例えば)から来たのか、それとも両方から来たのかはわかりませんset noclobber

興味深い事実:GNUの原作者の中には、cp主著者であるTorjorn Granlundがあります。gmplibプロジェクト(GNUマルチ精度)、コンパイル時定数で割るためのGCCの乗算逆最適化を発明/実装するのに役立ちました(1994年の論文、スタックオーバーフローQ&A)。

関連情報