ファイル記述子のコピーなしでstdoutとstderrを同じファイルにリダイレクトするのは安全ですか?

ファイル記述子のコピーなしでstdoutとstderrを同じファイルにリダイレクトするのは安全ですか?

空のディレクトリから始めます。

$ touch aFile
$ ls
aFile

その後、2つのパラメータがあり、lsそのうちの1つはこのディレクトリにありません。output私は>>同時書き込みを避けるためにこれを使用しています。

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

これはうまくいくようです。このアプローチに危険がありますか?

ベストアンサー1

いいえ、標準ほど安全ではありません>>bar 2>&1

書くとき

foo >>bar 2>>bar

bar開いたファイルを2回使用して、O_APPENDそれぞれ固有の状態(ポインタ、オープンモードなど)を持つ2つの完全に独立したファイルオブジェクト[1]を作成します。

2>&1これは単にシステムコールを呼び出すのとは非常に異なり、dup(2)同じファイルオブジェクトのstderrとstdoutを交換可能にエイリアスにします。

今質問があります。

O_APPEND複数のプロセスが同時にファイルにデータを追加すると、NFSファイルシステムでファイルが破損する可能性があります。これは、NFSがファイルの追加をサポートしていないため、クライアントカーネルがそれをエミュレートする必要があるため、競合状態がないと実行できません。

通常、2つの異なる場所でファイルが同時に記録される確率は非常に低いと仮定できますbarfoo >>bar 2>&1しかし、あなたは>>bar 2>>bar何の理由もなく何十倍も増えました。

[1] POSIX 用語の「ファイル記述を開く」。

おすすめ記事