シェルスクリプトでの/dev/nullの使用方法まとめ
/dev/null
は、書き込まれたデータをすべて破棄する特殊なデバイスファイルです。ブラックホール、つまり書き込み専用のファイルと同じだと考えてください。
/dev/null
は、コマンドラインやスクリプトで非常に便利です。
用途
/dev/null
不要な出力ストリームを破棄したり、入力ストリームの空ファイルとして使用されることがよくありますが、これらの操作は通常リダイレクトによって行われ、破棄したいデータはすべてそれらに書き込むことができます。
標準出力の破棄
シェルスクリプトを書く場合、コマンドの結果に沿ったロジックだけを実行したいので、コマンド実行中に中間結果を大量に出力させたくないので、コマンド実行中の入力をすべて
/dev/null
既存
a.sh
スクリプトは、入力されたシステムコマンドが存在するかどうかを判断するもので、次のように読みます。
#! /bin/bash
command -v $1
if [[ $? -eq 0 ]]; then
echo "command $1 exist... "
else
echo "command $1 not exist... "
fi
実行
. /a.sh top
コマンドを実行すると、次のような出力が得られます。
[tt@ecs-centos-7 dev_test]$ . /a.sh トップ
/bin/top
コマンド top が存在する...
説明
command -v command name
は、指定されたコマンド名のコマンドが存在するかどうかを調べ、存在する場合は指定されたコマンド名のパスを出力し、そうでない場合は何も出力しません。
$?
は直前のコマンドの結果を表し、0は成功、その他は失敗を意味します。
スクリプトの実行結果は、まず
top
コマンドのパスが続き、その後に
top
コマンドの存在を示すログ
を置く。
command -v $1
の結果をリダイレクトするために
/dev/null
をブロック化することができます。
top
コマンドパス、調整された
a.sh
は次のように読みます。
#! /bin/bash
command -v $1 >/dev/null
if [[ $? -eq 0 ]]; then
echo "command $1 exist... "
else
echo "command $1 not exist... "
fi
再実行
. /a.sh top
で、結果は次のようになります。
[tt@ecs-centos-7 dev_test]$ . /a.sh top
コマンド top が存在する...
[tt@ecs-centos-7 dev_test]$.
実行結果を見ればわかるように、このように
command -v $1
にリダイレクトします。
/dev/null
を出力することはありません。
top
コマンドのパスは現在
また、変更したスクリプトは、元のスクリプトと同じ結果で実行されます。
標準エラー出力を破棄する
シェルスクリプトでは、ファイルを削除する場合、ファイルが存在するかどうかを判断してから削除操作を行わないとエラーが出力され、一般的なファイル削除スクリプトは以下のようになります。
#! /bin/bash
if [ -f $1 ]; then
rm $1
fi
deleteコマンドの出力は、リダイレクトして
/dev/null
を使用すると、エラーメッセージを回避し、ファイルが存在するかどうかを判断する必要がなくなるので、修正した削除スクリプトは次のようになります。
#! /bin/bash
rm $1 >/dev/null 2>$1
コマンドを個別に実行する
. /d.sh t1.txt
と
. /d.sh t2.txt
で、以下のような結果になりました。
[tt@ecs-centos-7 dev_test]$ ls t*.txt
t1.txt
[tt@ecs-centos-7 dev_test]$ . /d.sh t1.txt
[tt@ecs-centos-7 dev_test]$ . /d.sh t2.txt
[tt@ecs-centos-7 dev_test]$ ls t*.txt
ls: t*.txt にアクセスできません: そのようなファイルまたはディレクトリはありません。
t1.txt
ファイルがカレントディレクトリにある場合、その
t2.txt
を削除しても、存在しないファイルを削除しても、エラーは出力されません。
ファイルの中身を空にする
ファイルの中身を消去する方法はいろいろありますが、ここでは
/dev/null
を使用してファイルの内容をクリアする例を示します。
[tt@ecs-centos-7 dev_test]$ cat t.txt
123456
[tt@ecs-centos-7 dev_test]$ cat /dev/null > t.txt
[tt@ecs-centos-7 dev_test]$ cat t.txt
ログの取り扱い
スクリプトでは、デバッグを容易にするためにログを出力するロジックが追加されることが多く、時にはこれらのデバッグログが多くなり、スクリプトのテストが通過した後に削除したりコメントアウトしたりすることがあります
ログを削除したりコメントアウトしたりせず、ログを出力せずにスクリプトを実行するための小技を紹介します。
例えば カレントディレクトリにログファイルがある
log.txt
スクリプトのデバッグログは、以下のように始まります。
echo " this is debug log" >> log.txt
デバッグログは、このファイルに、以下のような形式で書き込まれます。
スクリプトが機能テストに合格したため、デバッグログは
log.txt
現在
元のスクリプトはそのままにして、ローカルで
log.txt
を実行し、その後
ln -s /dev/null . /log.txt
コマンドを実行すると
log.txt
から
/dev/nulll
に書き込むソフトリンクはすべて
log.txt
は、実際には
/dev/null
というコンテンツがあり
/dev/null
は破棄されます
後でスクリプトを再度デバッグする必要がある場合は、リンクを削除してください。
シェルスクリプトにおける/dev/nullの使用についての説明は以上です。シェルスクリプトの/dev/nullについては、Script Houseの過去記事を検索するか、以下の記事を引き続き閲覧してください。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン