为什么 noclobber 变量不能防止您使用 cp 或 mv 覆盖现有文件?

Why can't the noclobber variable protect you from overwriting an existing file with cp or mv?

为什么 noclobber 变量不能防止您使用 cp 或 mv 覆盖现有文件?

因为 noclobber 是 shell 内部的功能,而 cpmv 是 shell 外部的程序,不会我(也不应该)知道 shell.

中发生的事情

打个比方,你的问题有点像问为什么Excel中的默认字体设置不影响Word

具体来说,noclobber 实际做的是它指示 shell 不要覆盖文件 作为输出重定向的结果 ,当你 运行 一个命令,例如 ls >files。将输出重定向到 files 是由 shell 本身执行的功能,因此在 shell.

中配置它是有意义的

另一方面,cpmv 有它们自己的功能来做同样的事情:你可以用 -n 开关调用它们来使它们失败而不是破坏文件。 (或者使用 -i 开关在破坏之前以交互方式询问。)

此外,即使 tee 也不会接受 noclobber 选项(如果已设置)。例如

[ankur@server1 ~]$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>


[ankur@server1 ~]$ cat /etc/centos-release
CentOS Linux release 7.8.2003 (Core)

[ankur@server1 ~]$ set -o | grep noclobber 
noclobber       on
[ankur@server1 ~]$ echo hi | tee myfile
hi
[ankur@server1 ~]$ ls -i myfile 
19731252 myfile
[ankur@server1 ~]$ cat myfile 
hi
[ankur@server1 ~]$ echo hiii | tee myfile
hiii
[ankur@server1 ~]$ ls -i myfile 
19731252 myfile
[ankur@server1 ~]$ cat myfile 
hiii