/dev/nullにリダイレクトするには、単一または二重山括弧を使用する必要がありますか?

/dev/nullにリダイレクトするには、単一または二重山括弧を使用する必要がありますか?

ここにほとんどの答えがあります。1][2][サム]次のように、単一の山括弧を使用して/ dev / nullにリダイレクトします。

command > /dev/null

しかし、/dev/nullに追加しても機能します。

command >> /dev/null

追加キャラクター以外にこうしない理由がありますか? /dev/nullのデフォルト実装よりも「より良い」ものはありますか?

編集する:
これオープン(2)マンページ説明する探す追加モードでファイルに書き込むたびに呼び出されます。

O_APPEND
ファイルが追加モードで開きます。各 write(2) の前に、ファイルオフセットは lseek(2) と同様にファイルの末尾にあります。ファイルオフセットの変更と書き込みは、単一の原子ステップで実行されます。

これにより>>。しかし、一方で文書によると、/ dev / nullを切り捨てることは未定義の作業のようです。

O_TRUNC
ファイルがすでに存在し、通常のファイルでアクセスモードが書き込みを許可している場合(つまり、O_RDWRまたはO_WRONLY)、長さはゼロに切り捨てられます。ファイルがFIFOまたは端末装置ファイルの場合、O_TRUNCフラグは無視されます。それ以外の場合、O_TRUNC の効果は指定されません。

POSIX仕様によると>既存のファイルを切り取る必要があります。、しかしO_TRUNC はデバイスファイルに対して実装定義されます。そして/dev/nullが切り捨てられたときにどのように応答するかについての説明はありません。

もしそうなら、/dev/nullの切り捨ては実際に指定されていませんか?そして探す呼び出しが書き込みパフォーマンスにどのような影響を与えますか?

答え1

定義によると、/dev/nullここに書かれたすべての内容がシンクされます。そのため、追加モードで書き込むかどうかに関係なく削除されます。データを保存しないため、実際に追加する内容はありません。

だから最終的にシンボル> /dev/nullを使用すると>短くなります。

編集された追加は次のとおりです。

open(2) マンページは、追加モードでファイルに書き込む前に毎回 lseek が呼び出されることを示しています。

注意深く読むと、次の内容が表示されます(強調)。

ファイルオフセットはファイルの末尾にあります。まるで検索(2)

lseekつまり、実際にシステムコールを呼び出す必要はなく、その効果も厳密に同じではありません。呼び出さないことは、追加モードで書くのとlseek(fd, SEEK_END, 0); write(fd, buf, size);同じではありません。O_APPEND別の呼び出しを使用すると、他のプロセスがファイルに書き込むことができるためです。システムコール時間前に追加データを破棄します。追加モードではこれは発生しません。NFS は実際の追加モードをサポートしません。)。

これ標準のテキストこの時点では言及されておらず、lseek書き込みはファイルの末尾にあるべきです。

もしそうなら、/dev/nullの切り捨ては実際に指定されていませんか?

あなたが引用した詩を見ると、それが成就として定義されていることは明らかです。これは、通常の実装がパイプやTTYと同じことを行うことを意味します。クレイジーな実装は他のタスクを実行でき、切り捨ては他のデバイスファイルに適していることを意味します。

lseek呼び出しは書き込みパフォーマンスに影響しますか?

テストを見てください。これが特定のシステムで確実にわかる唯一の方法です。または、ソースコードを読んで、追加モードが動作を変更する場所を確認してください。

答え2

効率が必要な場合はcommand >&-を使用してください。これにより、ファイル記述子をリダイレクトするのではなく閉じるため、ファイル記述子への書き込みに時間がまったく無駄になりません。

関連情報