1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルスクリプトでの/dev/nullの使用方法まとめ

2022-01-08 03:08:55

/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の過去記事を検索するか、以下の記事を引き続き閲覧してください。