3.8. Cygwin を Windows と共に効果的に使う

Cygwin は完全なオペレーティングシステムではありませんから、 幾つかの処理を成し遂げるために Windows に頼らざるを得ません。 例えば、Cygwin は Windows ファイルシステムに対する POSIX 的な視点を提供していますが、ファイルシステムそれ自身に対するドライバは提供していません。 そのため、Cygwin を効果的に利用することの一環として、Windows の効果的な利用方法について学ぶことになります。 多くの Windows ユーティリティが Cygwin の卓越したコマンドライン環境と強調動作するためのよい方法を提供しています。 例えば、ipconfig.exe はネットワーク構成情報を提供しますし、 net.exe はネットワークファイルやプリンタ資源の表示や構成を行います。 これらのツールの大部分は利用方法を表示するための /? スイッチをサポートしています。

不幸なことに、Windows の全バージョンに含まれる標準的なツールのセットというものはありません。 自分のシステムで利用可能なツールについて不慣れな読者のために、 ここで一般的なガイドを示しておきましょう。 Windows 95、98 そして Me には非常に限られたコマンドラインの構成ツールが含まれています。 Windows NT 4.0 はより多くのツールをカバーしており、Windows 2000 と XP でより拡張されました。Microsoft は Windows NT 4.0 (the Resource Kit Support Tools)、Windows 2000(the Resource Kit Tools)、 Windows XP(Windows Support Tools)に対して、自由にダウンロード可能なツール群も提供しています。 加えて、download.comsimtel.net、 and sysinternals.com といった多くの独立系のサイトでコマンドラインユーティリティが配布されています。 find.exesort.exe といった幾つかの Windows ツールは Cygwin に含まれるバージョンと衝突します。 このため、フルパス(/usr/bin/find)で実行するか、 Cygwin の bin ディレクトリを PATH の先頭に持ってくる必要があります。

Windows プログラムは POSIX パス名を理解することは出来ませんから、 ファイルシステムを参照する全ての引数は Windows(或いは DOS)形式であるか、 変換されなければなりません。Cygwin は Windows と POSIX のパスを相互に変換するための cygpath ユーティリティを提供しています。 任意のディレクトリから Windows の Explorer を起動するためのスクリプトなど、 このユーティリティの完全なオプションは利用方法の例に関する完全な説明については 項3.7.2. 「cygpath」 を参照して下さい。 幾つかの形式が大部分の Windows プログラムで利用可能です。以下に例を挙げます。

notepad.exe "$(cygpath -aw "Desktop/Phone Numbers.txt")"

幾つかのプログラムは Windows 形式のセミコロンで区切られたパスリストを必要としますが、cygpath-p オプションを利用すれば、このようなパスリストを POSIX のパス形式へと変換することが出来ます。 例えば、Java のコンパイルを bash から行う場合、次のようになるでしょう。

javac -cp "$(cygpath -pw "$CLASSPATH")" hello.java

クォートとサブシェルの利用が何とも不恰好ですが、 しばしばシェルスクリプト内で cygpath を使うよりも望ましいものです。

別の問題はコンソールベースの Windows プログラムからの出力を受け取ったり、 入力を与えたりする場合に発生します。 不幸なことに Windows のコンソールアプリケーションとの対話というのは、 変換用ユーティリティを使えば済むような簡単な問題ではありません。 Windows コンソールアプリケーション、及び command.com 又は cmd.exe の元で動作するように設計されているアプリケーションなどは、 他の状況に対応することが出来ません。 Windows はコンソールデバイスのバックエンドにアタッチする方法を提供してくれませんので、 Cygwin はコンソール(DOS 窓)で動作している場合に限り、コンソールからの入力を受け取ることが出来ます。 Cygwin は他の伝統的な UNIX の入出力方法である pty(仮想端末)もサポートしていますが、 Windows の制限上、それは完全ではありません。 基本的な問題とは、Cygwin の pty はパイプであり、そして幾つかの Windows アプリケーションは入出力をパイプにリダイレクトしたがらないということです。

これらの問題を取り扱う助けとすべく、Cygwin は Windows と UNIX の間の互換性を維持するための動作のレベルを調整出来るようになっています。 Windows プログラムとの最大の互換性を取るためには DOS プロンプトを使い、必要となる Cygwin コマンド或いはスクリプトだけを実行します。 次の策は、デフォルトの DOS 窓で bash を実行させることです。この場合、Cygwin をより UNIX 互換とするためには、環境変数 CYGWINtty を設定して下さい(項3.5. 「CYGWIN 環境変数」 を参照)。別の方法としては、オプションの rxvt パッケージに一般的な X11 端末エミュレータのネイティブ Windows 版が含まれています(rxvt を利用する場合、環境変数 CYGWINtty を設定する必要はありません)。rxvt.exe を利用すればより UNIX 的な環境が利用出来ることになりますが、Windows プログラムとの幾つかの互換性の問題が発生するかもしれません。

ncftplynx、そして wget のような多くの Cygwin の一般的なパッケージは、ネットワーク接続を必要とします。 Cygwin は Windows のネットワーク接続に依存していますので、 これらのツールが期待通りに動作しない場合は、Windows のツールを利用して問題解決を行うことが出来ます。 最初のテストは、URL に指定されているホストへと到達可能かどうかを調べるべく、 Windows 95 以降の全てのバージョンに含まれている数少ないユーティリティの一つである ping.exe を実行することです。inetutils パッケージをインストールしているのであれば、ftptelnet のようなユーティリティについては、Windows 版と Cygwin 版の両方が使えることでしょう。 これらのプログラムを実行した場合に問題が発生するのであれば、もう一つの版が正しく動作するかについて調べてみて下さい。

特定の状況のために、他の様々なプログラムを利用することが出来ます。 もしあなたのシステムが常時ネットワークに接続されていないのであれば、自動的なダイアルアップ接続を実現する rasdial.exe(或いは、Windows 95、98 及び Me 用の他のツール)に興味を持つことでしょう。 頻繁にネットワーク構成を変更するユーザは、netsh.exe (Windows 2000 と XP に付属しています)を利用したスクリプトによって、このような変更を行うことが出来ます。 プロクシが必要なユーザはオープンソースの NTLM Authorization Proxy Server や、無償の Hummingbird SOCKS Proxy を利用することによって、貴方の環境ででも Cygwin のネットワークプログラムを利用することが可能となるでしょう。

もう一つの問題としては、 UNIX スタイルのリンク(他のファイルを指し示すファイル)と Microsoft の .link ファイル(ファイルへのショートカットを提供する) の違いが挙げられます。ちょっと見たところ、両者はそっくりに見えますが、 現実には相当異なるものです。デフォルトでは、Cygwin はシンボリックリンクを標準的な Microsoft の .lnk ファイルと互換性があるように作成する仕組みを使います。 しかし、Cygwin のシンボリックリンクには作業ディレクトリやアイコンなどといった、 標準的な Microsoft のショートカットで利用できるような情報は含まれていません。 cygutils パッケージには、標準的な Microsoft の .lnk ファイルを作成するための mkshortcut ユーティリティが含まれています。

Cygwin がこれらネイティブのショートカットを他のシンボリックリンク同様に扱ったとすると、 tar アーカイブ内に Microsoft の .lnk ファイルをアーカイブすることは出来ませんし、その中に含まれる全ての情報を保持することも出来ません。 展開後、これらのショートカットは全ての追加情報を失い、 Cygwin の標準的なシンボリックリンクとの違いはなくなってしまいます。 従って、これら二種類のリンクは異なるように扱われます。 不幸なことに、これは通常の UNIX 的な手法でのシンボリックリンクの作成と利用は、 Windows のショートカットではうまくいかないことを意味しています。

Cygwin からの印刷は、cygutils に含まれる lpr (Windows ネイティブの lpr.exe と混同しないで下さい) を利用する方法も含めて、様々な方法が利用出来ます。 cygutils に含まれる lpr を簡単に利用するには、デフォルトのデバイス名を環境変数 PRINTER に設定します。 -d-P を利用して、コマンドラインからデバイスを指定することも出来ます。 このような指定は、環境変数の設定を上書きします。

デバイス名としては UNC パス \\server_name\printer_name)、 予約済みの DOS デバイス名(prnlpt1)、 或いはプリンタ共有にマップされたローカルポート名が利用出来ます。 シェル内で lpr を利用する際に便利なように、 UNC パスにはスラッシュを利用するという点に注意して下さい (//server_name/printer_name のようになります)。 シェルでは、バックスペースはエスケープとして利用されるのです。

lpr はプリンタに raw データを送ります。 整形は一切行われません。 全てではありませんが、多くのプリンタはプレーンテキストを入力として受け取ります。 もしあなたのプリンタが PostScript をサポートしているのであれば、 a2psenscript といったパッケージを利用して、印刷用のテキストファイルを作成することが出来ます。 ghostscript パッケージもまた、 PostScript から様々なネイティブのプリンタ言語への変換機能を提供します。 加えて、PostScript を印刷する ネイティブの Windows アプリケーション gsprint が、 Ghostscript website から手に入ります。