作为一个实验,我尝试运行set -o noclobber
然后运行echo foo > /dev/null
.我能够做到这一点;没有出现错误:
bash-3.2$ set -o noclobber
bash-3.2$ echo "foo" > /dev/null
bash-3.2$ echo "bar" > /dev/null
bash-3.2$ echo "baz" > /dev/null
但是,当我对之前创建的文件尝试相同的操作时,我看到了预期的错误:
bash-3.2$ touch bar.txt
bash-3.2$ echo "bar" > bar.txt
bash: bar.txt: cannot overwrite existing file
noclobber
该文件的处理方式/dev/null
与其他文件的处理方式是否不同?
注意:我明白为什么它可能会这样做(即因为/dev/null
它的性质和目的),但我没有看到任何这样的文档这里。我想这可能是一个未记录的功能,或者(可能更有可能)我只是错过了文档?
答案1
如果重定向运算符为“
>
”,并且已启用noclobber
内置选项set
,则如果名称由单词扩展产生的文件存在并且是常规文件,则重定向将失败。
但/dev/null
和家人不是常规的文件。它们是“字符特殊文件”:
$ [ -c /dev/null ] ; echo $?
0
$ [ -f /dev/null ] ; echo $?
1
这同样适用于其他非常规文件,例如 FIFO 管道:
$ mkfifo foo; set -o noclobber
$ echo > .bashrc
bash: .bashrc: cannot overwrite existing file
$ cat foo & echo a > foo
[1] 18857
a
(大概还有套接字、块设备等)