Subsystem for UNIX-based Applicationsを使う

 会社でサーバーとして使っていたSPARCマシンを入れ替えたのですが、このSolarisで動いてたシェルスクリプトを新しいWindows Server 2008環境でも実現する方法として考えたのが

などです。あとActivePerlとかもありますね。で、時間もないし同じことができるかどうか不安だしで、結局SUAを導入することにしました。前のスクリプトをなるべくそのまま使い回す方向で。実はすでにWindows Server 2003 R2で経験していて、一部のスクリプトの実行で使っていました。今回改めて導入したのでその時のメモです。
 インストール方法ですがこのページこのページを参考に、まず、Windows Server 2008でSUAを導入するには、「Windowsの機能」で、「UNIXベースアプリケーション用サブシステム」を追加します。これだけではPOSIX互換機能が追加されるだけでほとんど何もできませんので、Micorsoftが配布しているUtilitiesとSDKのパッケージ集をダウンロードします。Windows Vista SP1とWindows Server 2008用はこちらで、Windows Server 2003 R2用がこちらです。このパッケージは自己解凍のZIPファイルでとある場所に解凍され、その後インストールが始まります。カスタムを選択すると、

のインストールするしないを選択できて、たいていの場合はBase Utilitiesだけあればこと足りると思います。自分はUNIX Perlも入れました。
 で、スタートメニューの「UNIXベースアプリケーション用サブシステム」に項目が増えていて、ここのC Shellを実行すると一見コマンドプロンプトですがちゃんとしたCシェルが立ち上がります。
 ここでlsとかdateを実行すれば通常のUNIX上のコマンドと同じですね。では、Windowsのコマンドアプリを実行するのは、となりますが、その場合は、

$ /dev/fs/C/WINDOWS/system32/ipconfig.exe

などと実行してやれば、いつものコマンドプロンプトと同じように実行されて結果が表示されます。Cドライブは/dev/fs/Cとしてマウントされているんですね。ちなみにCシェル上と言ってもWindowsのコマンドを実行するときの引数はWindowsの流儀に従いますから

$ /dev/fs/C/WINDOWS/system32/xcopy.exe C:\\fromdir D:\\todir

などのように指定する必要があります。これらの点をふまえて、Solaris上のshスクリプトをSUAに持ってきて、なんとか動くようになりました。UNIX上のスクリプトでcutとかgrepとか使っているのが多くて、この辺の機能をWindowsネイティブで実現しようとすると結構大変なんですよね。
 あと、Windows上に持ってきたシェルスクリプトをタスクで定期的に実行するときなどですが、

> posix.exe /c /u /dev/fs/C/bat/script.sh

などとposix.exe経由で実行することになります。実は上記のC Shellの実行もこのposix.exe上で動いているようです。