Linuxの/dev/nullとは?仕組みと実践的な活用方法を徹底解説

/dev/nullとは何か
技術的に言えば、「/dev/null」は仮想デバイスファイルです。プログラムから見ると、これは実際のファイルとまったく同じように扱われます。ユーティリティはこの種のソースに対してデータの入出力を要求でき、オペレーティングシステムがそれに応答します。ただし、ディスクから読み込む代わりに、OS側でデータを動的に生成している点が特徴です。こうしたファイルの代表例が「/dev/zero」です。
一方、「/dev/null」の場合はデバイスファイルへの書き込みが中心になります。「/dev/null」に書き込んだデータはすべて破棄され、どこにも残りません。まるでデータを虚空に投げ捨てるようなものです。この仕組みがなぜ便利なのかを理解するには、まずLinuxや*nix系OSにおける標準出力と標準エラーの基本を押さえておく必要があります。
stdoutとstderrの基礎知識
コマンドラインユーティリティは、大きく分けて2種類の出力を生成します。通常の処理結果は標準出力に送られ、エラーメッセージは標準エラーに送られます。
デフォルトでは、stdoutとstderrはどちらもターミナルウィンドウ(またはコンソール)に紐づいています。つまり、これらに送られた情報は通常そのまま画面に表示されます。しかし、シェルのリダイレクション機能を使えば、この挙動を自由に変更できます。たとえばstdoutをファイルにリダイレクトすれば、画面に表示する代わりに後で読み返せるようファイルに保存されます。さらに、stdoutをLEDやLCDディスプレイといった物理デバイスに向けることも可能です。

パイプやリダイレクションについては、別記事でより詳しく解説しています。深く学びたい方はそちらも参考にしてください。
2>:標準エラーをリダイレクトします。例:2>/dev/nullや2>/home/user/error.log1>:標準出力をリダイレクトします。&>:標準エラーと標準出力の両方をまとめてリダイレクトします。
不要な出力を/dev/nullに捨てる
出力には標準出力と標準エラーの2種類があるため、/dev/nullの最も基本的な使い方は、どちらか一方だけを除外することです。実践的な例で確認してみましょう。電源設定に関するファイルを探すために、「/sys」ディレクトリ内で文字列を検索するケースを考えます。
grep -r power /sys/
一般ユーザー(root以外)には読み取れないファイルが数多く存在するため、大量の「Permission denied」エラーが出力されます。

これらのエラーは出力を散らかし、本当に欲しい検索結果を目視で見つけにくくします。「Permission denied」エラーはstderrに属するため、これを「/dev/null」にリダイレクトすれば解決します。
grep -r power /sys/ 2>/dev/null

ご覧のとおり、出力が格段に読みやすくなりました。
逆の発想も有効です。標準出力を捨ててエラーメッセージだけを表示したい場合は、次のようにします。
ping google.com 1>/dev/null

上のスクリーンショットでは、リダイレクトなしの場合、pingは接続先マシンに到達できる限り通常の出力を表示し続けます。一方、2番目のコマンドではネットワークが正常な間は何も表示されず、接続が切れた瞬間にエラーメッセージだけが現れます。接続監視などに応用できるテクニックです。
stdoutとstderrをそれぞれ別の場所に振り分けることもできます。
ping google.com 1>/dev/null 2>error.log
この場合、標準出力は一切表示されず、エラーメッセージのみが「error.log」ファイルに記録されます。
すべての出力を/dev/nullにリダイレクトする
場合によっては、標準出力も標準エラーも両方とも消したいことがあります。その方法は2つあります。
grep -r power /sys/ >/dev/null 2>&1
>/dev/null は「stdoutを/dev/nullに送る」ことを意味し、続く 2>&1 は「stderrをstdoutに送る」ことを意味します。ここで注意すべきは、stdoutを参照する際に単なる「1」ではなく「&1」と記述する点です。「2>1」と書いてしまうと、stdoutが「1」という名前のファイルにリダイレクトされるだけで意図した動作になりません。
もう一つの重要なポイントは記述順序です。リダイレクトの指定順を逆にしてみましょう。
grep -r power /sys/ 2>&1 >/dev/null
この場合、期待どおりには動作しません。2>&1 が解釈された時点でstderrがstdoutに結合されて画面に表示され、その後にstdoutだけが「/dev/null」に送られて抑制されるためです。結果として、すべての出力を消すどころか、エラーだけが画面に残ってしまいます。正しい順序を覚えるのが難しい場合は、もっとシンプルに書ける省略記法を使いましょう。
grep -r power /sys/ &>/dev/null
&>/dev/null は「stdoutとstderrの両方をこの場所にリダイレクトせよ」という意味になり、bashであれば直感的に使えます。
/dev/nullが役立つその他の活用例
たとえば、ディスクがシーケンシャルデータをどの程度の速度で読み取れるのかを測定したいとします。厳密なベンチマークにはなりませんが、実用上十分な精度で速度感をつかめます。ここで活躍するのが dd コマンドです。ddは通常stdoutに出力するか、ファイルへの書き込みを行いますが、of=/dev/null を指定すれば、この仮想ファイルへ書き込ませることができます。シェルのリダイレクションすら不要です。if= は読み込む入力ファイルの場所、of= は書き込み先の出力ファイル名を指定するオプションです。
dd if=debian-disk.qcow2 of=/dev/null status=progress bs=1M iflag=direct

また、サーバーからのダウンロード速度を測りたいものの、不要なデータをディスクに書き込みたくない場面でも役立ちます。解決策はシンプルで、通常のファイルではなく「/dev/null」を書き込み先に指定するだけです。
wget -O /dev/null https://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso
まとめ
本記事で紹介した例が、「/dev/null」を独自に活用するヒントになれば幸いです。一見地味な存在ですが、出力の制御やベンチマークなど、日常のコマンドライン作業を快適にしてくれる強力なツールです。
この特別なデバイスファイルの面白い使い方をご存じでしたら、ぜひコメント欄で共有してください!
-
LVFSとは?Linuxでファームウェア更新を行う方法を徹底解説
Linuxを日常的に使うデスクトップOSとして採用する場合、考慮すべき点は数多くあります。使用したいハードウェアのドライバーが用意されているか、必要なソフトウェアが利用可能か、さらに企業環境で主流となっているActive Directoryなどのセキュリティ管理機能との互換性があるかなど、事前の確認が欠かせません。 しかし、見落とされがちな重要な要素がもう一つあります。それが「ファームウェア」です。ファームウェアとはハードウェアのためのソフトウェアであり、ドライバーを通じてソフトウェアがやり取りできる設定やオプションのことを指します。ファームウェアの更新は本当に重要なのでしょうか?Linux
-
LinuxのAppImageとは?仕組みやSnap・Flatpakとの違いを徹底解説
Linuxディストリビューションで新しいソフトウェアを導入する際は、可能な限りパッケージマネージャーを使うのが基本です。そうすることでシステムがクリーンに保たれ、すべてのファイルが管理対象となって後から簡単に削除できるほか、ディストリビューションのアップグレード時のトラブルも回避しやすくなります。しかし、必要なソフトウェアがリポジトリに存在しなかったり、収録されているバージョンが古すぎたりすることもあります。そんなときは代替手段が必要になりますが、サードパーティ製の「.deb」や「.rpm」ファイルのダウンロードはあくまで最終手段にとどめておきましょう。 AppImageとは何か? Win