NUL ディバイス

$ANT_HOME/libに必要ライブラリを放り込んでおくことでサードパーティ製タスク(junitとか)におけるクラスローディング問題を回避しようということに先日決めた.

そこで,antに対するwrapper的なスクリプトを用意し,そのスクリプトの中でantを呼ぶ前に既定JARファイルをlibにコピーするという方法を採用した.

ところが,UNIX系OSとは違い,Windowsではファイルコピーを行ったりするとログが標準出力に出てしまう.

書籍『UNIXという考え方―その設計思想と哲学』に書いてあったが,UNIXではコマンドが正常に終了した場合には特に何もログをはかないという考えにそって各コマンドが実装されている.しかしWindowsはそうではない.

機能的には問題ないものの,どうみても格好が悪い.これを使った人も気になってしまうかもしれない.そういうわけでログ出力を回避する方法を探ってみた.するとWindowsにもNULディバイスが存在し,それにリダイレクトすれば出力は消えるということが分かった.

コマンドプロンプト> copy A.txt B.txt > NUL

UNIXでいうところの"/dev/null"に相当するNULディバイスというのが,全てのディレクトリに備わっているらしい.

情報を提供してくれた某先輩によると,

helpによると、
#if コマンドを使ってディレクトリを直接テストすることはできませんが、
#すべてのディレクトリには NULL (NUL) デバイスが存在します。
#そのため、NULL デバイスをテストすれば、ディレクトリの有無を判別できます。

とのことだ.

これでWindows用に作ったバッチファイルも,UNIX用に作ったシェルスクリプトも,利用者からは全く同じように動作しているふうに見えるようになった.