Io-Redirection

在沒有文件描述符副本的情況下將 stdout 和 stderr 重定向到同一個文件是否安全?

  • May 20, 2019

我從空目錄開始。

$ touch aFile
$ ls
aFile

然後我ls有兩個參數,其中一個不在此目錄中。我將兩個輸出流重定向到一個名為output. 我使用>>是為了避免同時寫。

$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile

這似乎有效。這種方法有什麼危險嗎?

不,它不只是像標準一樣安全>>bar 2>&1

當你寫作

foo >>bar 2>>bar

您使用bar兩次打開文件O_APPEND,創建兩個完全獨立的文件對象

$$ 1 $$,每個都有自己的狀態(指針、打開模式等)。 2>&1這與僅呼叫系統呼叫非常不同dup(2),並使同一文件對象的 stderr 和 stdout 可互換別名。

現在,有一個問題:

O_APPEND如果多個程序一次將數據附加到文件,可能會導致 NFS 文件系統上的文件損壞。這是因為 NFS 不支持附加到文件,所以客戶端核心必須模擬它,這在沒有競爭條件的情況下無法完成。

您通常可以指望文件同時從兩個不同的地方寫入的機率很低barfoo >>bar 2>&1但是被你的>>bar 2>>bar你只是增加了十幾個數量級,沒有任何理由。

$$ 1 $$POSIX 術語中的“打開文件描述”。

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