当设置了“noclobber”选项时,“/dev/null”与其他文件的处理方式是否不同?

当设置了“noclobber”选项时,“/dev/null”与其他文件的处理方式是否不同?

作为一个实验,我尝试运行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

3.6.2 重定向输出说:

如果重定向运算符为“ >”,并且已启用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

(大概还有套接字、块设备等)

相关内容