Io-Redirection
在沒有文件描述符副本的情況下將 stdout 和 stderr 重定向到同一個文件是否安全?
我從空目錄開始。
$ 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 不支持附加到文件,所以客戶端核心必須模擬它,這在沒有競爭條件的情況下無法完成。您通常可以指望文件同時從兩個不同的地方寫入的機率很低
bar
。foo >>bar 2>&1
但是被你的>>bar 2>>bar
你只是增加了十幾個數量級,沒有任何理由。$$ 1 $$POSIX 術語中的“打開文件描述”。