Linuxにおける/dev/null
Linuxにおける/dev/nullは、ヌルデバイスファイルです。これに書き込まれたものは破棄され、読み取り時にはEOFが返されます。
これはコマンドラインハックで、投げられたものを吸い込む掃除機のようなものです。
このファイルの意味を理解し、どのように活用できるかを見てみましょう。
/dev/nullのプロパティ
catコマンドを使用して読み取ろうとすると、これはファイルの終端(EOF)文字を返します。
cat /dev/null
以下は有効なファイルです。これは検証することができます。
stat /dev/null
これにより、私はアウトプットが得られます。
File: /dev/null
Size: 0 Blocks: 0 IO Block: 4096 character special file
Device: 6h/6d Inode: 5 Links: 1 Device type: 1,3
Access: (0666/crw-rw-rw-) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-02-04 13:00:43.112464814 +0530
Modify: 2020-02-04 13:00:43.112464814 +0530
Change: 2020-02-04 13:00:43.112464814 +0530
このことから、このファイルはサイズが0バイトであり、割り当てられたブロックもゼロです。ファイルのパーミッションも設定されており、誰でも読み書きはできますが、実行はできません。
実行可能なファイルではないため、|演算子を使用して/dev/nullにリダイレクトすることはできません。唯一の方法は、ファイルリダイレクション(>、>>、または<、<<)を使用することです。
下の図は、/dev/nullが実際に有効なファイルであることを示しています。
では、/dev/null の一般的な利用例を見てみましょう。
Linuxでの/dev/nullへのリダイレクト
私たちは、使用するスクリプトの出力を/dev/nullにリダイレクトすることで、任意の出力を破棄することができます。
たとえば、このテクニックを使ってエコーメッセージを捨てることを試してみることができます。
echo 'Hello from JournalDev' > /dev/null
結果が破棄されるため、何の出力も得られません。
「コマンドを間違って実行して、その出力を/dev/nullにリダイレクトしてみましょう。」
cat --INCORRECT_OPTION > /dev/null
私たちはまだこうした出力を得ています。
cat: unrecognized option '--INCORRECT'
Try 'cat --help' for more information.
なぜこれが起こっているのか?それはエラーメッセージがstderrから来ているが、私たちはstdoutからの出力のみを捨てているためです。
私たちは、stderrも考慮に入れる必要があります。 (Watashitachi wa, stderr mo kouryo ni ireru hitsuyou ga arimasu.)
エラーメッセージを削除する
標準エラー出力(stderr)を/dev/nullにリダイレクトしましょう。このために、stderrのファイルディスクリプタ(=2)を使用できます。
cat --INCORRECT_OPTION > /dev/null 2>/dev/null
これは私たちが必要とするものを提供してくれます!
同じことをする別の方法があります。最初に標準エラー出力(stderr)を標準出力(stdout)にリダイレクトし、次に標準出力を/dev/nullにリダイレクトする方法です。
これの構文は次のようになります。
command > /dev/null 2>&1
末尾に「2>&1」を見てください。我々はデジャージャ(2)をスタンダードアウト(1)にリダイレクトします。シェルに対して、宛先ファイルがファイル名ではなくファイルディスクリプタであることを伝えるために「&1」を使用します。
cat --INCORRECT_OPTION > dev/null 2>&1
もし2>1を使用すると、stderrが1という名前のファイルにのみリダイレクトされます。これは私たちが望んでいることではありません!
結論
以下は、できるだけわかりやすく説明しましたので、Linuxで/dev/nullを使う際にどういう意味かがわかるようになりましたね!質問があれば、下のコメントセクションでどうぞ。
参考文献
- StackOverflow Question