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

相关内容