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

时间:2016-01-22 01:27:45

标签: bash cp mv

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

2 个答案:

答案 0 :(得分:14)

因为noclobber是shell内部的功能,而cpmv是shell外部的程序,并且不会(并且不应该) )了解shell中发生的事情。

要进行类比,您的问题有点像询问为什么Excel中的默认字体设置不会影响Word。

具体来说,noclobber实际做的是它指示shell不会因输出重定向而覆盖文件 ,就像运行{{1}这样的命令一样}}。将输出重定向到ls >files是shell本身执行的一个函数,因此可以在shell中配置它。

另一方面,filescp有自己的功能来执行相同的操作:您可以使用mv开关调用它们,使其失败而不是clobber文件。 (或者用-n开关在开口前交互式询问。)

答案 1 :(得分:0)

如果设置了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