先月,cygwin 本体のパッケージのバージョンが 1.5.18 から 1.5.19 へと 半年ぶりに更新されました。 cygwin-1.5.19-1 のリリース後,細かな不具合が見つかり, 数日間小改訂が続きましたが, 今は cygwin-1.5.19-4 で安定しています。
01:~$ cygcheck -f /bin/cygwin1.dll cygwin-1.5.19-4 01:~$ cat /proc/version CYGWIN_NT-5.1 1.5.19(0.150/4/2) 2006-01-20 13:28 01:~$
旧版からの変更点については www.cygwin.com の アナウンス記事を参照してください。 広範囲にわたり改良・改善されていることが分かります。 ただし,Windows の環境変数の扱いについて 重大な非互換性が新しく入っていますから,Cygwin から一般の Windows アプリケーションを起動する場合には新しく対応が必要です。
更新の時点で bash や zsh はその対応が済んでいましたが, cygstart コマンドは 2月10日ごろリリースされた cygutils-1.2.10-1 パッケージまで未対応でした。
旧 cygutils-1.2.9-1 の cygstart にみる非互換性
cygutils パッケージに含まれる cygstart コマンドで Windows のコマンドプロンプトを起動します。
01:~$ cygstart cmd 01:~$環境変数 TEMP の値を見てみます。
C:\cygwin\home\suzuki>set TEMP TEMP=/cygdrive/c/DOCUME~1/suzuki/LOCALS~1/Temp C:\cygwin\home\suzuki>Cygwin 形式のパス名のままになっています。 Windows XP の「スタート」から「すべてのプログラム」→ 「アクセサリ」→「コマンド プロンプト」で起動した場合と比べます。 後者は下記のようになります。
C:\Documents and Settings\suzuki>set TEMP TEMP=C:\DOCUME~1\suzuki\LOCALS~1\Temp C:\Documents and Settings\suzuki>環境変数 TMP についても同様です。 Cygwin から cygstart コマンドで起動した Windows アプリケーションは, TEMP や TMP に書かれている Cygwin 形式のパス名を理解できないため, 一時ファイル用の場所をこれらの環境変数から取得できないことになります。
Windows にもとからある環境変数ではありませんが, 環境変数 HOME も同じく Cygwin 形式のままになることも問題です。 Unix から Windows に移植されたアプリケーションのいくつか, たとえば GIMP (§19.3) は, もし環境変数 HOME が定義されていれば,その設定を優先的に使います。 しかし, それが C:\cygwin\home\suzuki のような Windows 形式でなく, /home/suzuki のような Cygwin 形式であるため, アプリケーションがホームディレクトリの場所を理解できずに (見つけようとして見つけられずに),動作に異常をきたします。
実際に GIMP 2.2.10 を
01:~$ cygstart gimp-2.2.exeとして起動すると, 「データファイルを検索中 フォント」の表示で固まって無応答になります。 対照実験として,
01:~$ unset HOME 01:/home/suzuki$ cygstart gimp-2.2.exeと HOME を未定義にすると無事起動します (HOME を未定義にしたとき,bash のプロンプトが変化する点に注意してください)。
現在,この cygstart の不具合は改修されています。 もしも cygwin パッケージを 1.5.19 に更新したならば, cygutils パッケージも 1.2.10 以降に更新します。 また,Windows アプリケーションを独自に起動するオリジナルの Cygwin プログラムがある場合は, 起動したアプリケーションでの環境変数の設定状況を確認します。 ちなみに,早期に対応済みだった bash では下記のようになります。
01:~$ cmd Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:\cygwin\home\suzuki>set TEMP TEMP=C:\DOCUME~1\suzuki\LOCALS~1\Temp C:\cygwin\home\suzuki>set HOME HOME=C:\cygwin\home\suzuki HOMEDRIVE=C: HOMEPATH=\Documents and Settings\suzuki C:\cygwin\home\suzuki>
§4.3 では,cygstart コマンドを open コマンドとして呼び出せるようにしました。 この名前は Mac OS X の同名のコマンドに由来しています。 もっとも,§4.3 で説明したようにオプションなしの1引数で使う場合は, 確かに同様に使えますが,それ以外での共通点はほとんどありませんでした。 とりわけ, ファイルに対するデフォルト以外のアプリケーションの起動に問題がありました (cygstart は第1引数にアプリケーションをとることもできますが, 第2引数のファイル名を Cygwin 形式のまま渡してしまいます)。
そこで,Mac OS X の open file コマンドでよく使われる次の二つのオプションを実装してみることにします。
- -a application
- specifies the application to use for opening the file.
- -e
- causes the file to be opened with /Applications/TextEdit
-a application オプションは, 指定した file を指定した application で開きます。 application が GUI (のランチャー) から認識されていれば, 必ずしもそこに PATH が通っている必要はありません。 -e オプションは, 指定した file (実際には file のゼロ個以上の並び) を標準テキストエディタ /Applications/TextEdit で開きます。
下記がその解の一つです。 ファイルをここに用意しましたから, /usr/local/bin/open として置いてください。
#!/bin/zsh -
# hack for gimp-win etc.
unset HOME
# hack against cygwin-1.5.19 & cygutils-1.2.9
#TEMP=`cygpath -w "$TEMP"`
#TMP=`cygpath -w "$TMP"`
declare -i erred=0
if getopts ":a:e" opt
then
case $opt in
a)
if [ $# -eq 3 ]
then
shift
# quicktimeplayer seems to expect an absolute path.
argv[2]=\"`cygpath -a -w "$2"`\"
else
erred=1
fi
;;
e)
shift
exec /usr/local/bin/meadow "$@"
;;
?)
erred=1
esac
else
[ $# -ne 1 ] && erred=1
fi
if ((erred))
then
echo "Usage: open [-a APPLICATION] FILE"
echo " open -e [FILE ...]"
exit 1
fi
#echo -E "$@"
exec /bin/cygstart "$@"
ここでは -e オプションに対して, Mac OS X の TextEdit ではなく, §16.3の meadow スクリプトを呼び出すことにします*1。 meadow スクリプトと本スクリプトは zsh を利用していますから, zsh パッケージが必要です。
また,アプリケーションの振舞が非 Cygwin 環境の場合と同じになるように, 環境変数 HOME を未定義にします*2。
内容を簡単に説明します。
":a:e" の最初のコロンは,内蔵のエラー表示を抑制します。
aの後のコロンは,
aが引数付きオプションであることを指示します。
この open スクリプトの使用例を下図に示します。 最初の open は *.png ファイルを,それに対するデフォルトのアプリケーションで開きます。 次の open は QuickTimePlayer.exe で開きます。 3番目の open は gimp-2.2.exe で開きます。 アプリケーションに PATH を通す必要はありません (ただし,gimp-2.2 は名前にドットを含んでいるため, .exe を省略できないことに注意してください)。
この章では,非 Cygwin アプリケーションの例として Windows 版の GIMP 2.2.10 を (gimp-2.2.exe として) 使ってきました。 GIMP とは GNU 画像操作プログラム (GNU Image Manipulation Program) を意味する, フォトレタッチや画像合成用の重要なフリー・ソフトウェアの名前です *3。
Windows 版 GIMP 2.2.10 は 2006年 2月 11日現在, gimp-win.sf.net から "Stable version download" として入手できます。 Windows XP では,"GTK+ 2 Runtime Environment (version 2.8.9)" のインストーラ gtk+-2.8.9-setup.zip と, "The GIMP for Windows (version 2.2.10)" のインストーラ gimp-2.2.10-i586-setup.zip をダウンロードし, この順に, デフォルトどおり全選択でインストール (full installation) すれば OK です。
一部に Windows 版 GIMP は不安定で実用にならない,という風評がある模様ですが, 自分が使った限りでいえば,途中で異常終了したりすることはありませんでした。 実用性は抜群です。 おそらく,昔のバージョンの悪い評判が そのまま固定しているのでしょう*4。
*1 TextEdit は,Emacs に準じたキー操作体系をもち, テキストファイルの3種類の改行コード ('\r', '\n', '\r\n') に対応しています。Meadow での代用は良い近似です。
*2 たとえば GIMP 2.2.10 は,標準の状態では $USERPROFILE の下に .gimp-2.2 フォルダを設けて設定を記録しますが,環境変数 HOME が定義されているときは, $HOME の下に .gimp-2.2 フォルダを設けます。 両者を一致させず,かつ環境変数 HOME を Cygwin 環境だけで定義するようにすると (普通の設定の Windows に普通に Cygwin をインストールすればそうなります), GIMP がどちら経由で起動されたかにより, 別々の .gimp-2.2 フォルダが使われることになります。 これは,おそらくは望ましくない状態でしょう。
*3 GIMP は実用価値においてだけ重要なフリー・ソフトウェアではありません。 GIMP を組むために作られたライブラリ GTK+ (GIMP Tool Kit) は, 後に代表的なデスクトップ環境のひとつ GNOME の主要な構成要素になりました。 フリー・ソフトウェアの系統樹を書いたとき, GIMP はその重要な節点の一つに位置付けられます。
*4 このことは日本語のページを Google と Yahoo! で検索しても裏付けられます。 GIMP で検索すると, 過去の情報で凍結しているページが上位陣を独占しています。 自分が調べたときには,きちんと現在の版に追いついているページは, 上位から順に下って,どちらも 「GIMP2を使おう」 が最初のようでしたが,これは Google で 43 位,Yahoo! で 7 位でした。 国内でこのような状態になっている経緯はよく分からないのですが, GIMP とそれを支える人々 (頭のさがる思いです) にとって, あまり幸福な状況とはいえないことは確かでしょう。