(2005年12月追記: この章の内容は 2004 年当時のいわば過去の歴史です。 将来似たようなことが起こったときのための参考事例としてお読みください)
前回から思いがけず時間がたってしまいました。 その間,Cygwin にも大きな変化がありました。 3月に cygwin-1.5.9 がリリースされましたが, 5月に cygwin-1.5.10 が, 9月に cygwin-1.5.11 が, そして11月 11日*1 に cygwin-1.5.12 がリリースされました。 もしも旧バージョン,とりわけ呪われた cygwin-1.5.10 を使っているならば, 今が更新するのによい季節でしょう。
Cygwin ユーザにとって難儀だったのは,今年 (2004年),
初夏から晩夏まで使われた cygwin-1.5.10
に日常の操作に支障を来たす欠陥があったことです。
この版は内部実装に大きな変更があったということで,
心なしか動作が軽快になりました。
しかし,同時にディレクトリのアクセスに致命的な不具合を抱えていました。
たとえば,Desktop フォルダ
に何かのソース・プログラム一式のディレクトリ・ツリーを展開し,
それを他の場所のディレクトリ・ツリー全体と diff -r
で比較しようとしたとき,
Desktop フォルダのツリー内のディレクトリが必ずしも正しくアクセスされない,
という現象がしばしば出ました。
diff -r でまとめて比較したり,
cp -av でまとめてコピーしたり,
といった操作が信頼してできないわけです。
安心感の欠如は操作環境としては致命的な欠陥でした。
日本語 Windows では Desktop フォルダの実体が
「デスクトップ」という全角カタカナの名前のフォルダであることが,
不具合発症の原因でした。
実はこの不具合は比較的早期に発見され,解決されていました。 残念なことは改修版が一連のスナップショットとして公開されただけで, 正式リリースは他の不具合改修もあわせて 9月の cygwin-1.5.11 まで持ち越されたことです。 cygwin-1.5.11 とそれに続く cygwin-1.5.12 には日常の操作に支障を来たすような不具合は (少なくとも今のところ知る限りでは) ありません。
そんなわけで夏の間,自分は大半のマシンを cygwin-1.5.10
リリース直前のパッケージ構成で凍結するとともに,
いくつかのマシンにスナップショット版 cygwin1.dll
を導入することでしのいでいました。
今現在,日常の用途でスナップショットを利用することはないと思いますが, 今後,似たようなことが起こるかもしれませんから, 参考のためスナップショットを利用する方法を説明しておきます。
cygwin1.dll を置き換えるときは,
cygwin1-20041117.dll.bz2 というような名前のファイル
(ここで 20041117 は年月日を表します) をダウンロードします。
01:~$ bunzip2 -v cygwin1-20041117.dll.bz2 cygwin1-20041117.dll.bz2: done
01:~$ ls -l cygwin1-20041117.dllFAT では実行パーミッションは決め打ち (といいますか実は無意味) ですが, NTFS では設定しだいで変えられます。 もしも NTFS で実行パーミッションがないと,インストールしても, Cygwin を開始するとき bash がエラーを起こして起動しません。*2 もしなければ
01:~$ chmod a+x cygwin1-20041117.dllなどとして,実行パーミッションを与えてやります。
01:~$ mv cygwin1-20041117.dll /bin 01:~$ open /bin 01:~$ exitもしもほかに Cygwin プログラムを動かしていれば,それもすべて終了させます。 動かしているかどうかよく分からなければ,
exit する前に
ps コマンドを実行するか,または
/proc/ を ls
して確かめます。
01:~$ cat /proc/version
Cygwin の各パッケージを更新する普通の方法は,setup.exe を利用する方法です。 ただし,いくつか注意点があります。
更新されたパッケージがあるとき, いったん現在のパッケージがアンインストールされてから, 新パッケージがインストールされます。 いくつかのパッケージはアンインストール時に専用のシェルスクリプトを走らせます。 /etc/preremove/ にあるシェルスクリプトがそれです。
このようなシェルスクリプトを持ったパッケージを, cygwin-1.5.12 のような基本パッケージと一緒に更新すると, 基本パッケージがアンインストールされた後, 残りのパッケージのためのシェルスクリプトを実行しようとして失敗します。 そのときにはシェルが使えなくなっているからです。
現在の実装ではアンインストールはアルファベット順ですから, cygwin 本体とともに gcc-mingw シリーズのパッケージを更新する場合などがこれに該当します。 今はパッケージのリリース日をずらすという運用でカバーしているようですが, 毎日まめに更新していないと,はまることがあります。
回避策のひとつは,はまりそうなパッケージがあるとき, それをあらかじめアンインストールすることです。 なお,他から依存されているパッケージの場合, 次に setup.exe をしたとき,自動的に再インストールされます。
2005年12月24日追記: http://cygwin.com/ml/cygwin/2005-12/msg00909.html によれば, 2005年12月23日(現地時間)にリリースされた bash-3.0-13 は, 「It also improves the postinstall scripts to be more robust, so that you are less likely to get in a situation where /bin/sh does not exist」ということだそうです。 preremove についての言及がないのが気がかりですが, ひょっとしたらこの問題を解決しているかもしれません。
設定ファイルは,原則として最初にインストールされたものが使われます。 パッケージを更新したとき, 昔のままの設定ファイルが不具合を起こすことがあります。 最近の例では,10 月に man パッケージが man-1.5o-1 に更新されたとき, この現象が起こりました。 更新後,man コマンド実行のたびにエラーメッセージが表示されるようになったのです。
01:~$ man man.conf Unrecognized line in config file (ignored) JNROFF LANG=ja_JP.UTF-8 /usr/bin/groff -Tnippon -mandocj Unrecognized line in config file (ignored) KNROFF /usr/bin/groff -Tkorean -mandoc Unrecognized line in config file (ignored) JNEQN /usr/bin/eqn -Tnippon Unrecognized line in config file (ignored) KNEQN /usr/bin/eqn -Tkorean MAN.CONF(5) MAN.CONF(5) NAME man.conf - configuration data for man
原因は /usr/share/misc/ にある man コマンド設定ファイル man.conf が昔のバージョンのままだったことでした。一般にパッケージのインストール時, 設定ファイルがなければ, デフォルトの設定ファイルから新しく作りますから*3
01:/usr/share/misc$ rm man.conf
として設定ファイルを削除してから, man パッケージを再インストールすればよいわけですが, この場合は下記の手順が簡単でしょう。
01:/usr/share/misc$ cp man.conf.default man.conf 01:/usr/share/misc$ chmod 644 man.conf
追記: 2004年12月12日ごろリリースされた新しい man パッケージ man-1.5o1-1 では デフォルトの設定ファイルが /usr/share/misc/man.conf.default から /etc/defaults/usr/share/misc/man.conf に変更されました。
もう Meadow も 2.00 版がリリースされてずいぶんたってしまいました。 さしあたり内容を時代遅れにしないために, 次回は大急ぎでその設定について説明します。
*1 世界平和記念日,つまり (いろいろな意味で西洋の文化に大きな衝撃を与えたあの) 第一次世界大戦の終戦記念日にあわせてでしょうか。 東洋の伝統ではもともと奇数の月と日が重なる日はめでたいのですが (桃の節句,端午の節句,七夕,菊の節句),語呂のよい日付であることは確かです。
*2 たとえば Unix 上の Web ブラウザでファイルをダウンロードし, 他のファイルと一緒にまとめて tar アーカイブにして Windows に持っていき, NTFS 上で展開した場合,おそらく実行パーミッションが落ちています。
smb 経由でファイルをリモートの Windows マシンに転送した場合,
テキスト・ファイルやアーカイブ・ファイルに実行パーミッションがついて
Cygwin 上の ls -F の出力がうるさくなるきらいがあります。
Windows XP の簡易ファイル共有を使って転送すると,
ファイルの所有者が Guest になります。
そんなわけで,Unix から Cygwin にファイルを転送するとき,
いったん tar 等でアーカイブする方法が普通は賢いのですが,
今回のような場合は気をつける必要があります。
特に Mac OS X 上の Safari でダウンロードすると ファイルの日付がオリジナルのまま保存されるから快適だ, という人がはまりがちです (…と他人ごとのように書いていますが >_<)。
*3 /etc/postinstall/man.sh.done の内容を参照。