/dev/null の意味と使い道、ファイルを空で初期化

/dev/null の意味と使い道、ファイルを空で初期化

/dev/null の意味

/dev/null – Wikipedia

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/null2>&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

参考URL

Linuxカテゴリの最新記事