Bash設置了
設置了 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
沒有看到任何與此相關的文件。我想這可能是一個未記錄的功能,或者(可能更有可能)我只是錯過了文件?
如果重定向操作符是’
>
’,並且已啟用內置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
(而且,大概還有套接字、塊設備等)