2019年8月22日木曜日

Windowsコマンド:「NUL」で標準出力と標準エラー出力を表示させない

WindowsのNULデバイスにリダイレクト


 以前、リダイレクトの方法について、標準出力、標準エラー出力のMS-DOSコマンドプロンプトでの使い方を紹介しましたが、(逆に)一切表示もファイル書き込みもさせたくない場合について書こうと思います。


NUL(ヌル)デバイス:


 古い話から入ると、UNIX系OSには“/dev/null”という特殊なシステムパス(スペシャルファイル)が存在していました。ここに入れられた情報データはすべて捨てられ、正しくEOF(エンド・オブ・ファイル)が返されるという(異次元の様な)場所です。
 例えば、印刷時に10ページ中の10ページ目は白紙なので印刷したくない→プリンタに投げる代わりにNULLに投げる→印刷されないと同時に正しくキューをぶん投げしたというアック(ACK)が返ってくる、というようなことにも使えました。
 Windowsでは、「nul」(大文字でも可)に投げることで似たような事を実現します。


実行例(dirの結果をリダイレクト):


 リダイレクトの詳細は以前書きましたので省略します。

 まず最初に、もともとどう表示されるかを適当なフォルダに移動したのち「dir」を実行し確認します。

 次に、リダイレクトを付けた後ろに“nul”を付けて実行してみます。大文字小文字どちられも可。
 dir > nul

 結果は何も表示されなくなったのがわかると思います。
 そしてもう一度「dir」を実行し、本来リダイレクトしたのだから出来ているであろう“ファイル”を確認しても「nul」というファイルはできていません。
 これが抹消された情報(dirの実行結果の文字列)という事になります。


 なお、上の画像では、あえて「null」という4文字だとどうなるのか?を後半で試しています。
 ファイルとして作成されました。
 Windowsでは、あくまでも「nul」という3文字がヌルデバイスファイル名という事ですね。

 また、適当なファイル名として「nul」が使えないことも確認できます。
 試しに「nul.png」というファイル名で画像を保存しようとした場合は以下のようにエラーが返ってきます。Windowsにより「予約されている名前」だそうです。


 ここで、以前の記事にもある「標準出力」と「標準エラー出力」の両方が表示される場合に、両方とも「nul」にぶん投げ抹消する方法を試してみました。

 最初の黄色の部分では、あえてエラーが出るような実行をしてみています。
 正しく「標準エラー出力」として“そんなファイルはみつかりませんねぇ~?”というのをお堅く返してきています。

 そしてその文言すら消し去る方法として、当たり前ですが、結果としては
 dir > nul 2>&1
 という書き方であれば両方の出力を「nul」にぶん投げることに成功します。


 めったに使うことはないかもしれませんが、DOSバッチでゴリゴリ何かさせたい場合で、かつ、実行中の表示を一部分だけファイル出力したくない場合などには有用です。

 例)
 ping -n 11 localhost > nul 2>&1
 →何も表示されず、10秒待機した後、復帰しプロンプトが帰ってます。
 DOSバッチでのなんちゃってタイマー的な使い方で古くからある常套手段。
 今となってはWindows10のTIMEOUTコマンドを使った方がいいのかもしれません(?)。なぜ今更実装したのか、意図はわかりかねます。もっと早くにあってもよさそうでしたが。。。



- PDS PIS 研究室 室長 -

0 件のコメント:

コメントを投稿