Linux は、多くの目的のためにいくつかの仮想デバイスをホストする興味深いオペレーティングシステムです。 システムで動作するプログラムに関する限り、これらの仮想デバイスは実際のファイルであるかのように動作します。 ツールはこれらのソースからデータを要求し、供給することができます。 データはディスクから読み込むのではなく、OS が生成します。

そのような例の 1 つに /dev/null があります。 これは、すべての単一の Linux システムに存在する特別なファイルです。 しかし、他のほとんどの仮想ファイルとは異なり、読み込む代わりに書き込むために使用される。 dev/nullに書き込んだものはすべて廃棄され、虚空に忘れ去られます。 UNIX システムでは NULL デバイスとして知られています。

なぜ、何かを虚空に捨てたいのでしょうか。 dev/null が何であるか、そしてその使用方法を確認しましょう。

前提条件

/dev/nullの使用方法に深く入り込む前に、標準出力と標準エラー データ ストリームを明確に把握しておく必要があります。 stdin、stderr、および stdout に関するこの詳細なガイドをチェックしてください。

簡単にリフレッシュしましょう。 任意のコマンドライン ユーティリティが実行されると、必ず 2 つの出力が生成されます。 出力は stdout に、エラーは (発生した場合) stderr に送られます。 デフォルトでは、これらのデータ ストリームは両方ともターミナルに関連付けられます。

たとえば、次のコマンドは二重引用符で囲まれた文字列を出力します。

$ echo “Hello World”

次のコマンドは、前に実行したコマンドの終了ステータスを表示します.

$ echo $?

前のコマンドが正常に実行されたので、終了ステータスは0です。 それ以外の場合は、終了ステータスが異なります。 無効なコマンドを実行しようとするとどうなるのでしょうか?

$ adfadsf
$ echo $?

さて、ここでファイル記述子について知っておく必要があります。 UNIXのエコシステムでは、これはファイルに割り当てられた整数値です。 標準出力(ファイル記述子=1)と標準エラー(ファイル記述子=2)の両方が特定のファイル記述子を持っています。 ファイル記述子(この状況では1と2)を使用すると、stdoutとstderrを他のファイルにリダイレクトできます。

まず、次の例では、echoコマンドのstdoutをテキスト・ファイルにリダイレクトしています。 ここでは、ファイルディスクリプタを指定していない。

$ echo “Hello World” > log.txt

次のコマンドは、stderrをテキストファイルにリダイレクトするものである。

$ asdfadsa 2> error.txt

Using /dev/null

出力を /dev/null

さて、これで /dev/null を使う方法を知る準備が整いました。 まずは、正常な出力とエラーをフィルタリングする方法を確認しましょう。

$ grep -r hello /sys/

しかし、ルート権限なしでは、grepは多くのファイルにアクセスできないため、多くのエラーを発生させます。 このような場合、”Permission denied “というエラーが発生します。

$ grep -r hello /sys/ 2> /dev/null

出力はずっとよく見えますね。 何もない!

次の例では、Google に ping を実行します。

$ ping google.com

ただし、すべての ping 成功結果を見たいわけではありません。 その代わり、Ping が Google に到達できなかったときのエラーにのみ焦点を当てたいと思います。

$ ping google.com 1> /dev/null

ここで、標準出力の内容はエラーだけを残して /dev/null に吐き出されます。

Redirect all output to /dev/null

特定の状況で、出力はまったく有用ではないかもしれません。 リダイレクトを使えば、すべての出力をvoidにダンプできます。

$ grep -r hello /sys/ > /dev/null 2>&1

このコマンドは少し壊そうか? まず、すべてのstdoutを/dev/nullにダンプします。 そして、2 番目の部分で、bash に stderr を stdout に送るように指示しています。 この例では、出力するものは何もありません。 しかし、もし混乱したら、コマンドが正常に実行されたかどうかをいつでも確認することができます。

$ echo $?

コマンドが多くのエラーを発生させたので値が2になっています。

stdoutとstderrのファイル記述子を忘れがちな人は、次のコマンドで大丈夫です。 前のコマンドをより一般化した形式です。 stdout と stderr の両方が /dev/null にリダイレクトされます。

$ grep -r hello /sys/ &> /dev/null

その他の例

これは興味深いものです。 dd ツールを覚えていますか? ファイルを変換したりコピーしたりするための強力なツールだ。 dd についてもっと詳しく知ることができます。 dd を使って、ディスクのシーケンシャルリードの速度をテストすることができます。 もちろん、正確な測定ではありません。

$ dd if=<big_file> of=/dev/null status=progress bs=1M iflag=direct

ここでは、ビッグファイルとして Ubuntu 18.04.4 ISO を使用しました。

同様に、インターネット接続のダウンロード速度をテストすることもできます。

$ wget -O /dev/null <big_file_link>

Final thoughts

うまくいけば、この /dev/null ファイルとは何かが明確に理解されたことでしょう。 これは、書き込まれた場合は破棄し、読み込まれた場合は null を読み込むという特殊なデバイスです。 この興味深い機能の真の可能性は、興味深い bash スクリプトにあります。

bash スクリプトに興味はありませんか? bashスクリプトの初心者向けガイドをチェックしてみてください。

お楽しみに!

コメントを残す

メールアドレスが公開されることはありません。