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年论文, 堆栈溢出问答)。