cp --backup=CTRL,为什么是 nil 和 never?

cp --backup=CTRL,为什么是 nil 和 never?

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. 

为什么使用nil和这两个词never?它们在英语中的含义与它们的实际用法不符。

答案1

1.

在里面最老的GNU Coreutils 'cp' 版本,--backup纯粹是一个布尔选项,不接受任何参数。有一个分离 --version-control选项(和一些环境变量)来启用版本控制,这些字符串实际上是后者的参数。

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

但我强烈怀疑这些字符串被添加后,version-control它本身就开始作为布尔选项存在,never后来才加上模式——此时字符串tnil被添加来表示前两个布尔选择。

现在tnil来自 Lisp 的某个变体,它们充当布尔关键字(真/假)——出于历史原因,GNU 项目非常喜欢 Lisp。不幸的是,它们在 GNU Coreutils 版本控制功能中的使用早于 Coreutils 源代码首次提交到版本控制。

以前这些工具被称为“GNU fileutils”,但我找不到它的源代码存储库——尽管 Coreutils 存储库确实有一个较旧的变更日志列出“史前”变化的文件:

1285 Tue May 22 00:56:51 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)
..
1293         * getversion.c: New file.
1294         * mv.c (main), cp.c (main), ln.c (main): Control backup types
1295         with getenv ("VERSION_CONTROL") and +version-control or -V.
..
1300         * backupfile.[ch]: Rename var `version_control' to `backup_type'.

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

2.

我还怀疑这些值实际上来自基于 Lisp 的Emacs,也就是说,“备份”和“版本控制”都被设计成模仿在 Emacs 中发现的而不是仅为 Coreutils 而发明的新东西。(我没有尝试配置 Emacs,但我知道它确实可以进行~备份。)

  • 编辑:核心工具文本信息页面中备份选项部分,确认这些值直接对应于 Emacs 选项。请参阅info coreutils Backup

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

1897 Local Variables:
1898 mode: indented-text
1899 left-margin: 8
1900 version-control: never
1901 End:

从 GNU Emacs 的文档中可以看出,此选项接受三个值:nilnever和“其他任何值”——乍一看很奇怪,但尝试将 nil 读作“false”,将其他任何值读作“true”(我认为这是 Lisp 的工作方式?这也是 Ruby 的工作方式),您就会开始将其识别为以前布尔值的选项。

但是尽管 GNU Emacs源存储库确实可以追溯到 1985 年,看来这些价值观甚至更老,所以我真的不知道接下来该去哪里。

3.

Emacs 可能将编号备份放在首位,因为当时的一些系统已经做了在操作系统层面上也是一样。OpenVMS 就是一个至今仍然存在的例子,其中文件名file.ext;version和操作系统自动地每次写入文件时都会增加版本号。(这意味着您最终会login.com;40 login.com;41 login.com;42弄乱主目录,直到您手动删除purge旧版本。)

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

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

相关内容