先に、
Ruby で .NET Framework 風のクラス/メソッドを記述して自分で使っていることを書いた。
理由は先の投稿に書いたとおり、Ruby のクラスライブラリに慣れる余裕がないので、使い慣れた構文で(いちいちリファレンスマニュアルを引っ張り出すことなく)サクサクっスクリプトを書けるようになるためだ。
その目的において、Ruby でもうひとつ好きなところは、バッククォートによるコマンドシェル実行。
先の投稿では、ファイルをコピーするのに .NET Framework の File クラスと同じく、File.Copy メソッドが使えるようにコードを自作した、と書いたが、「`copy #{src} #{dst}`」と書いてもよいわけだ(※プラットフォームは Windows)。
おまけに標準出力は、このバッククォートメソッドの戻り値として返される。errorlevel でエラーステータスを返してくれない(けど、便利なのでどうしても使いたい)コンソールアプリなども実際存在するが、大抵の場合、標準エラー出力にはエラーメッセージをよこしてくるので、これを拾ってエラーチェックすることもできる。
ちょっと注意としては、標準エラー出力を標準出力へリダイレクトさせないと、さすがの Ruby もバッククォートメソッドの戻り値には拾ってこられないこと(具体的には「somecmd.exe
2>&1」とパイプ2をパイプ1へ注ぎ込むようにする)。
とにかく、Ruby スクリプト中で、「サブディレクトリごとファイルをコピーしたいがどうしよう」といったときも、「`xcopy /s foo bar`」と書いてしまえばよいのだ。
コマンドプロンプトを使い慣れていない人にはどうでもいいことなのだろうが、逆に、それなりにコマンドプロンプトを利用できている人であれば、そのコマンドの知識をそのまま Ruby で活かせる。
もちろん、このやり方は、OS や OS のバージョンが変わると通用しないだろうし(Linux には xcopy という名前のコマンドはないでしょう、きっと)、rubyw.exe でコンソールなしで実行していても一時的にチラっとコマンドプロンプトの黒いウィンドウが現れてすぐに消えたりもする。
しかし、手段は選ばず、さくさくスクリプトを書いて、さっさと仕事を済ませる、といった目的には、もってこいの機能であり、私の場合は、これこそが Ruby に求めることであったりする。