为什么noclobber变量不能用cp或mv覆盖现有文件?
答案 0 :(得分:14)
因为noclobber
是shell内部的功能,而cp
和mv
是shell外部的程序,并且不会(并且不应该) )了解shell中发生的事情。
要进行类比,您的问题有点像询问为什么Excel中的默认字体设置不会影响Word。
具体来说,noclobber
实际做的是它指示shell不会因输出重定向而覆盖文件 ,就像运行{{1}这样的命令一样}}。将输出重定向到ls >files
是shell本身执行的一个函数,因此可以在shell中配置它。
另一方面,files
和cp
有自己的功能来执行相同的操作:您可以使用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