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
/選項-n
僅cp
由 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
。 - 海灣合作委員會
-Wclobbered
warning - “警告可能被 longjmp 或 vfork 更改的變數。” (我不知道這個詞是否存在於 2009 年,但它表明這個詞在各種上下文中被用來描述此類事物,包括其他程式中的選項名稱)。
添加的 coreutils 提交的作者--no-clobber
Kamil Dudka 絕對熟悉 GCC 內部結構:他(後來?)寫了一個GCC插件用於 C 程式的形式驗證。
我不知道 GCC 內部結構是否影響了他對名稱的選擇,或者這是否來自現有的 shell 選項,例如set noclobber
,或兩者兼而有之。
有趣的事實:GNU 的原作者cp
包括 Torjorn Granlund,其主要作者gmplib 專案(GNU 多精度),並幫助發明/實現了 GCC 用於除以編譯時常數的乘法逆優化(1994年論文, 堆疊溢出問答)。