Io-Redirection

我應該使用單尖括號還是雙尖括號重定向到 /dev/null?

  • March 15, 2017

這裡的大多數答案[ 1 ] [ 2 ] [ 3 ]使用單個尖括號重定向到 /dev/null,如下所示:

command > /dev/null

但附加到 /dev/null 也可以:

command >> /dev/null

除了多餘的字元,還有什麼理由不這樣做嗎?這些中的任何一個對 /dev/null 的底層實現“更好”嗎?

編輯:

open *(2)*聯機幫助頁lseek在每次以附加模式寫入文件之前被呼叫:

O_APPEND

文件以追加模式打開。在每次 write(2) 之前,文件偏移量位於文件末尾,就像使用 lseek(2) 一樣。文件偏移量的修改和寫入操作作為單個原子步驟執行。

這讓我覺得使用>>. 但另一方面,根據該文件,截斷 /dev/null 似乎是一個未定義的操作:

O_TRUNC

如果文件已經存在並且是正常文件並且訪問模式允許寫入(即,是 O_RDWR 或 O_WRONLY),它將被截斷為長度 0。如果文件是 FIFO 或終端設備文件,則忽略 O_TRUNC 標誌。否則,未指定 O_TRUNC 的效果。

並且 POSIX 規範說>應該截斷現有文件,但是O_TRUNC 是為設備文件定義的實現,並且沒有關於 /dev/null 應該如何響應被截斷的消息。

那麼,截斷 /dev/null 實際上是未指定的嗎?lseek呼叫對寫入性能有影響嗎?

根據定義,/dev/null寫入它的任何內容都會下沉,因此無論是否以附加模式寫入都無關緊要,它都會被丟棄。因為它不儲存數據,所以真的沒有什麼可附加的。

所以最後,> /dev/null用一個>符號寫會更短。

至於編輯添加:

open(2) 手冊頁說 lseek 在每次以附加模式寫入文件之前被呼叫。

如果你仔細閱讀,你會看到它說(強調我的):

文件偏移量位於文件末尾,就像使用lseek(2)

意思是,它實際上並不(需要)呼叫lseek系統呼叫,而且效果也不完全相同:呼叫lseek(fd, SEEK_END, 0); write(fd, buf, size);withoutO_APPEND與 append 模式下的 write 不同,因為通過單獨的呼叫,另一個程序可以寫入文件在系統呼叫之間,丟棄附加的數據。在附加模式下,這不會發生(通過NFS 除外,它不支持真正的附加模式)。

標準中的文本在這一點上沒有提到lseek,只有寫入應該放在文件的末尾。

那麼,截斷 /dev/null 實際上是未指定的嗎?

從您所指的經文來看,顯然它是由實現定義的。這意味著任何理智的實現都將與管道和 TTY 一​​樣,即沒有。一個瘋狂的實現可能會做其他事情,並且在其他設備文件的情況下,截斷可能意味著一些明智的事情。

lseek 呼叫對寫入性能有影響嗎?

測試一下。這是在給定係統上確定的唯一方法。或閱讀原始碼以查看附加模式在何處更改行為(如果有)。

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