cp --backup=CTRL,为什么为零而不是从不?

mid*_*ite 10 cp

https://linux.die.net/man/1/cp

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX. The version control method may be selected via the --backup option or through the VERSION_CONTROL environment variable. Here are the values:

none, off
    never make backups (even if --backup is given) 
numbered, t
    make numbered backups 
existing, nil
    numbered if numbered backups exist, simple otherwise 
simple, never
    always make simple backups

As a special case, cp makes a backup of SOURCE when the force and backup options are given and SOURCE and DEST are the same name for an existing, regular file. 
Run Code Online (Sandbox Code Playgroud)

为什么使用“ niland”这个词never?它们的英文含义与实际用法不符。

use*_*686 12

1.

\n

最古老的GNU Coreutils \'cp\' 版本中,--backup纯粹是一个布尔选项,不带任何参数。原来有一个单独的 --version-control选项(和一些环境变量)来启用版本控制,这些字符串实际上是后者的参数。

\n

换句话说,--backup=simple曾经是--backup --version-control=never

\n

但我强烈怀疑,在添加这些字符串之前version-control,它本身就以布尔选项的形式开始了它的生命,never后来添加了 \xe2\x80\x93 模式,此时添加了字符串tnil来表示前两个布尔选项。

\n

现在,t由于nil历史原因,它们来自 Lisp 的某些变体,充当布尔关键字(真/假)\xe2\x80\x93,GNU 项目非常喜欢 Lisp。不幸的是,它们在 GNU Coreutils 版本控制功能中的使用早于 Coreutils 源代码最初提交到版本控制的时间。

\n

以前这些工具被称为“GNU fileutils”,但我找不到 \xe2\x80\x93 的源存储库,尽管 Coreutils 存储库确实有一个较旧的ChangeLog文件列出了“历史前”更改:

\n
1285 Tue May 22 00:56:51 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)\n..\n1293         * getversion.c: New file.\n1294         * mv.c (main), cp.c (main), ln.c (main): Control backup types\n1295         with getenv ("VERSION_CONTROL") and +version-control or -V.\n..\n1300         * backupfile.[ch]: Rename var `version_control\' to `backup_type\'.\n
Run Code Online (Sandbox Code Playgroud)\n

(你知道 GNU--long-options最初看起来是 吗+like-this?如果我不得不猜测的话,他们改用 来--避免与 X-Windows 应用程序混淆,X-Windows 应用程序使用相同的“+option”语法来禁用布尔选项;你仍然可以在 Xterm 中看到这一点。 )

\n

2.

\n

我还怀疑这些值实际上来自基于 Lisp 的Emacs,即“备份”和“版本控制”都被编程为模仿Emacs 中的值,而不是专门为 Coreutils 发明的。(我没有尝试过配置 Emacs,但我知道它确实可以进行~备份。)

\n
    \n
  • 编辑: Coreutils texinfo页面的备份选项部分确认这些值直接对应于 Emacs 选项。看info coreutils Backup
  • \n
\n

在同一个“ChangeLog”文件的最后,有一个“局部变量”部分,用于配置 Emacs 编辑器(相当于 Vim“modeline”或现代的 .editorconfig 文件),其中显示了 Emacs \' 自己的version-control参数使用值never使用此文件的

\n
1897 Local Variables:\n1898 mode: indented-text\n1899 left-margin: 8\n1900 version-control: never\n1901 End:\n
Run Code Online (Sandbox Code Playgroud)\n

正如 GNU Emacs 文档中所示,该选项接受三个值:nil,never和“anything else”\xe2\x80\x93,乍一看看起来很奇怪,但尝试将 nil 读为 \'false\' 并将其他值读为\'true\'(我\xc2\xa0认为这就是 Lisp 的工作原理?这就是 Ruby 的工作原理),你将开始将它识别为以前的布尔选项。

\n

但是,尽管 GNU Emacs源存储库确实可以追溯到 1985 年,但这些值似乎更古老,所以我不太确定从哪里开始。

\n

3.

\n

Emacs 可能会将编号备份放在第一位,因为当时的某些系统已经在操作系统级别执行了相同的操作。OpenVMS 是一个至今仍然存在的示例,其中文件名是,file.ext;version并且每当写入文件时操作系统都会自动递增版本号。(这意味着您总是会在login.com;40 login.com;41 login.com;42主目录中乱扔垃圾,直到您手动删除purge旧版本。)

\n

因此,最初的 GNU Emacs 很可能只有这种版本控制(使用布尔值t/nil来启用/禁用它),并且“简单”备份模式是在很久以后才添加的。

\n

我还找到了“MIT CADR Lisp Machine”的源代码存档,其中包括一个名为 ZWEI \xe2\x80\x93 的早期 Emacs 实例,并且在存档中找到的许多文件确实是数字版本的,例如extract/nzwei/dired.55. (虽然我不确定这个特定的例子是由操作系统还是编辑器完成的;我没有深入研究。)

\n

  • 很好的猜测。Emacs 文档(Ch v 版本控制)明确提到了“t”,确认该选项曾经是一个布尔值:“控制备份文件版本号的使用。当 t 时,无条件地创建数字备份版本。当 nil 时,使它们对于已经有一些的文件。值“never”意味着不创建它们。” [来源](https://github.com/emacs-mirror/emacs/blob/master/lisp/files.el) Emacs Lisp 确实使用 `()` 又名 `nil` 来表示 false,并像 Common Lisp 一样使用其他任何东西来表示 true ,“t”类似于 C++ 中的“true”。Scheme 使用 `#f` 和 `#t` 来代替,并且 `'()` 的计算结果为 true。 (3认同)