書き込み/削除に/dev/nullの代わりに/dev/zeroを使用する必要がある場合はいつですか?

書き込み/削除に/dev/nullの代わりに/dev/zeroを使用する必要がある場合はいつですか?

FHS薬によると/dev

これには以下が含まれます。

The following devices must exist under /dev.

/dev/null
      All data written to this device is discarded. A read from this device will return an EOF condition.

/dev/zero
      This device is a source of zeroed out data. All data written to this device is discarded. A read from this device will return as many bytes containing the value zero as was requested.
...

次の両方を確認してください。

All data written to this device is discarded

私はたくさんのチュートリアルを読んで、彼らは/dev/nullいつもデータを破棄した。しかし、どちらも書く目的が同じであるため(廃棄)

質問

  • /dev/zero以上の使用を強制する必要がある場合/dev/null書く/捨てる目的?

ところで、他の違いは実際にはほとんど読む- 私たちは:

答え1

/dev/nullLinuxを使用している場合は、リダイレクトを「強制」しません/dev/zero。すでに知っているように、どちらの方法でも同じ結果が得られます。

つまり、/dev/nullデータを削除するには常ににリダイレクトする必要があります。書き込みは/dev/nullデータを捨てることであることを誰もが理解しているからです。

一方、書き込みも/dev/zeroデータを捨てますが、これが何をしたいのかすぐにはわかりません。

/dev/zeroそれ以外にも、BSDなどの他のUnicesで書き込みが許可されているかどうかを心配しています。私は/dev/zeroPOSIXがそれを要求しないと思います。/dev/nullはい。したがって、意図された目的で使用することは、/dev/null移植性を最大化することです。他のことを行うことは、何の利点もなく移植性を犠牲にすることです。

答え2

ユースケースがあります。プログラムがstdoutが指示され、/dev/null動作を変更することを検出し(私の考えではUnix方式ではありませんが)、それを望まない場合です。

私は1つの例だけを知っていますtar。ディレクトリ内のすべてのファイルを実際にディスクから読み取ることができること(I / Oエラーなどなし)を確認したいとします。 1つの方法はtar次のとおりです/dev/null

tar -cv dir/ > /dev/null

ただし、試してみると、tarファイルの内容が実際には読み取られず、メタデータのみが読み取られることがわかります(コマンドが速すぎます)。そして

tar -cv dir/ > /dev/zero

ファイルの内容を読み込みます(遅く実行され、より多くのディスクが読み取られます)。

答え3

必須のケースはありませんが、ユースケースは次のとおりです。

  • /dev/空:通常はファイル名を指定する必要がありますが、データは気にしないときに使用されます。

    通常、これは次の目的で使用されますstdout。プログラムの出力を望まないので、出力を次にリダイレクトします/dev/null(それで破棄されます)。状態を確認できるスクリプト(およびcronjob)では非常に便利ですが、テキストは混乱を引き起こすだけです。

    /dev/null空のファイルを書くために読むことができます(例えば、他の構文がより良いかもしれません: > empty_file_name)。または、テーブルのヘッダーのみが必要ですが、データを渡したくない場合

  • /dev/ゼロ:たとえば、次のコマンドを使用してデータを「物理的に」消去する必要がある場合に使用しますdd。ハードドライブを0で上書きします。 0は終了しないため、元のファイル(または占有スペース)を使用せずにすべてのハードドライブを上書きしますが、はるかに/dev/random遅くなります。

    私が何を書いたか覚えていません(名前が良い/dev/zeroと思います)。/dev/null

ノート/dev/zero引き続きデータを提供します(そしてプログラムにデータがあることを知らせます)。/dev/null代わりに(入力として使用されている場合)、データがないことをプログラムに通知してください。

リンクした文書が面白いです。ご覧のとおり、通常は書き込み/dev/nullと読み取りの両方に使用されます/dev/zero(文書にリストされているすべてのケースの最初のケースに適しています)。

通常、スクリプトを作成するときに使用する新しい方法を見つけることができます。私がすることと、特定のプログラムに必要なパラメータによって異なります。また、プログラムに多くの確認を提供する必要がある場合にyesコマンドを提供するコマンド(新しい行を含む)もあります。y

関連情報