為什麼 cp 不覆蓋檔案的選項稱為 --no-clobber?

為什麼 cp 不覆蓋檔案的選項稱為 --no-clobber?

cp是一個非常受歡迎的 Linux 工具,由 GNU 基金會的 coreutils 團隊維護。

預設情況下,同名的檔案將被覆蓋,如果使用者想要更改此行為,他們可以添加--no-clobber到複製命令中:

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

為什麼不是類似的東西--no-overwrite

答案1

克洛伯在資料操作的上下文中,「」意味著透過覆蓋資料來破壞資料。在 Unix 環境中的文件上下文中,該詞的使用至少可以追溯到 20 世紀 80 年代初,甚至可能更早。切石必須set noclobber配置>為拒絕覆蓋現有檔案(後來set -o noclobber在 ksh93 和其他 sh 風格的 shell 中)。什麼時候新增了 GNU coreutils --no-clobber(2009 年),他們使用了與 shell 相同的詞彙。

答案2

因為這實際上是一個標準術語。正如中所解釋的維基百科

在軟體工程中,破壞檔案或電腦記憶體就是覆蓋其內容。術語文件將破壞定義為

覆蓋,通常是無意的:“我走出了數組的末尾並破壞了堆疊。”比較綠草、塗鴉、垃圾和粉碎堆疊。

正如同一頁所提到的,bash 和其他 shell 也使用該術語set -o noclobber或等效術語。這只是此類事物的標準術語,因此對於cp.

答案3

術語“clobber”在計算領域是眾所周知的。

--no-clobber/選項-ncp由 Kamil Dudka 在 2009-01-14 添加 <[電子郵件受保護]>(在 github 上提交)。

特別是在 GNU 專案中,它也用於 GCC描述 CPU 指令或內嵌 asm 語句何時破壞暫存器的內容。所以它不是一個隨機選擇的英文單詞,而且從事用 C 語言編寫的 GNU 專案的人們至少會熟悉 GCC 文件或其他使用它的 GNU 專案開發人員對該術語的使用:

  • (clobber x)GCC-內部機器描述文件告訴 GCC ISA 中每條指令的作用。 (與內聯彙編類似的約束)
  • GNU C 擴充彙編內嵌asm()語句有一個「clobber」部分,告訴編譯器哪個註冊了內嵌 asm 模板步驟。就像這個無用的、無意義的 x86 範例:
    asm("xor %eax,%eax; mfence" ::: "eax", "memory", "cc");。例如所以問答詢問這些術語中的函數呼叫約定。
  • 海灣合作委員會文檔為了-fcall-used-reg將其描述為告訴編譯器給定的暫存器被函數呼叫“破壞”(即調整呼叫約定)。相對於-fcall-saved-reg或者-ffixed-reg
  • 海灣合作委員會-Wclobberedwarning - “警告可能被 longjmp 或 vfork 更改的變數。” (我不知道這個詞是否存在於 2009 年,但它表明這個詞在各種上下文中被用來描述此類事物,包括其他程式中的選項名稱)。

添加的 coreutils 提交的作者--no-clobberKamil Dudka 絕對熟悉 GCC 內部結構:他(後來?)寫了一個GCC插件用於 C 程式的形式驗證。

我不知道 GCC 內部結構是否影響了他對名稱的選擇,或者這是否來自現有的 shell 選項,例如set noclobber,或兩者兼而有之。

有趣的事實:GNU 的原作者cp包括 Torjorn Granlund,其主要作者gmplib 專案(GNU 多精度),並幫助發明/實現了 GCC 用於除以編譯時常數的乘法逆優化(1994年論文, 堆疊溢出問答)。

相關內容