/dev/null の意味
Linux をはじめ Unix系のOSでは /dev/null
という疑似デバイスファイル(スペシャルファイル)が用意されています。/dev/random
や /dev/urandom
と同じように特殊なデバイスファイルです。
/dev/null
に書き込まれたデータはすべて破棄され、どこからどれだけ読み込んでも何もデータを返しません(EOF
を返します)。つまり何を読み書きしても何も起きないようなデバイスファイルとして用意されているのが /dev/null
です。
いらない出力ストリームを捨てたり、空のデータの入力ストリームとして扱ったりできます。
どんなデータでも捨てられるので "ブラックホール" や "ビットバケツ" などと呼ばれているようです。
/dev/null の使い道
上述の通り、いらない出力ストリームを捨てたり、空のデータとしてどこからでも使えます。
いらない出力データの捨て先として /dev/null を使う
ブラックホールとして、不要なデータの捨て先として /dev/null
が使えます。
例えばコマンドやスクリプトを実行した際に、標準出力や標準エラーに何かしらのデータが出力されることがあります。そのような結果が不要であったりむしろ出力されてほしくない場合に /dev/null
にリダイレクトすればデータがすべて破棄されます。
もちろん出力を抑制するオプションやコマンドがあればそれを利用すればよいのですが、そのようなものが用意されていないときには /dev/null
にリダイレクトすることで破棄します。
標準出力や標準エラーをリダイレクトして扱うにはファイル記述子(ファイルディスクリプタ)を理解しなければ難しいです。
なんとなくリダイレクトで 1
が出てくれば標準出力だな、2
が出てくれば標準エラーだなと思えばよいです。
標準出力を /dev/null にリダイレクトして破棄
my_script.sh
を以下のように定義します。
#!/bin/bash
# 標準出力
echo 'stdout'
# 標準エラー
echo 'stderr' >&2
標準出力のみを /dev/null
にリダイレクトすることで破棄できます。標準エラーのみ出力されることが確認できます。
# 標準出力を /dev/null に捨てる
$ bash my_script.sh 1>/dev/null
stderr
標準エラーを /dev/null にリダイレクトして破棄
my_script.sh
を以下のように定義します。
#!/bin/bash
# 標準出力
echo 'stdout'
# 標準エラー
echo 'stderr' >&2
標準エラーのみを /dev/null
にリダイレクトすることで破棄できます。標準出力のみが確認できます。
# 標準エラーを /dev/null に捨てる
$ bash my_script.sh 2>/dev/null
stdout
標準出力も標準エラー両方を /dev/null にリダイレクトして破棄
my_script.sh
は同様に標準出力と標準エラーにそれぞれ出力します。
#!/bin/bash
# 標準出力
echo 'stdout'
# 標準エラー
echo 'stderr' >&2
標準出力と標準エラー両方を /dev/null
にリダイレクトするには、標準エラーを標準出力にまとめて出力するようにリダイレクトし、標準出力を /dev/null
にリダイレクトします。これで両方をまとめて /dev/null
に捨てることが可能です。
# 標準出力と標準エラーを両方 /dev/null に捨てる
$ bash my_script.sh 1>/dev/null 2>&1
1>/dev/null
が標準出力を /dev/null
に捨てるリダイレクトで、2>&1
が標準エラーを標準出力にリダイレクトする設定です。これで両方が最終的に /dev/null
に流れて破棄されます。
1>/dev/null
と 2>&1
はこの順番で書かないとうまくいきません。1(標準出力), 2(標準エラー) の順にリダイレクトの設定を行いましょう。
# 順番が間違っているのでうまくいかない
$ bash my_script.sh 2>&1 1>/dev/null
stderr
# 正しくはこう
$ bash my_script.sh 1>/dev/null 2>&1
以上のように出力結果が不要な場合には、/dev/null
に捨ててしまいましょう。
/dev/null を使ってファイルを空にする
/dev/null
はデータを読み出しても空です。これを使ってファイルを内容をゼロ初期化(空ファイル)にできます。ファイルが存在しなければ空ファイルが作成されます。
cp /dev/null [ファイルパス]
cp /dev/null [ファイルパス]
のように /dev/null
をコピーすることでファイルを空にできます。
# 適当なファイルを作成する
$ echo 'hello world' > input.txt
# /dev/null をコピーして input.txt を空にする
$ cp /dev/null input.txt
# ファイルサイズが0になっていることを確認
$ ls -l input.txt
-rwxrwxrwx 1 tm tm 0 Feb 27 16:00 input.txt
cat /dev/null > [ファイルパス]
cat
で /dev/null
で読み出してリダイレクトしても空になります。
$ cat /dev/null > input.txt
/dev/null を使わないでファイルを空にする
/dev/null
を使わないでもファイルを空にできます。
touch で空ファイルを新規作成
touch
コマンドを使用すればファイルのタイムスタンプを更新できます。ファイルがもし存在しなければ空のファイルを新規で作成します。すでに存在すればタイムスタンプが更新されます。
touch
コマンドは、作成であれば空のファイルを作成できます。
# touch でファイル作成
$ touch hoge
# タイムスタンプ確認
$ ls -l hoge
-rwxrwxrwx 1 tm tm 0 Feb 27 16:12 hoge
# touch でタイムスタンプ更新
$ touch hoge
# タイムスタンプ更新確認
$ ls -l hoge
-rwxrwxrwx 1 tm tm 0 Feb 27 16:13 hoge
echo で空の出力をリダイレクトして空ファイルを作成
echo -n
でデータなし(改行もなし)で出力できます。これをリダイレクトすれば cat /dev/null
をリダイレクトした時と同じように空ファイルを作成したりファイルを空にしたりできます。
$ echo -n > input.txt
どちらかといえばこの方法が一番空ファイルを作ったり初期化したりするのに直感的な気がしなくもないです。
truncate でファイルを初期化
truncate
コマンドはファイルサイズの拡張や縮小を行うためのコマンドです。このコマンドでサイズゼロに初期化できます。
$ truncate input.txt --size=0
コメントを書く