Bash

設置了 noclobber 選項時,/dev/null 的處理方式是否與其他文件不同?

  • October 6, 2022

作為一個實驗,我嘗試執行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沒有看到任何與此相關的文件。我想這可能是一個未記錄的功能,或者(可能更有可能)我只是錯過了文件?

第 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

(而且,大概還有套接字、塊設備等)

引用自:https://unix.stackexchange.com/questions/720024