[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:15368] Re: bash の初期化がおかしい



小池@JAISTです。

>>>>> In [debian-devel : No.15367] 
>>>>>	ukai@debian.or.jp (Fumitoshi UKAI) wrote:
> 違います。sh_get_env_value() でとれるのは今動いているbashで設定した
> 環境変数(でbashの子プロセスに適用される環境変数)であって、bashそれ
> 自体の環境変数ではないからです。

はい、そのつもりで書いたので、

> > この段階で setenv("LANG", "ja_JP.eucJP") の様な処理がなされないままで、
> > setlocale(LC_CTYPE, "") が行なわれる為に問題が発生する、という事でしょ
> > うか?でしたら、そちらの方が本質的な問題だと思われます。まだコードを追っ
> > てないので、そう行えない、他の要因があるのかもしれませんが。

setenv("LANG", "ja_JP.eucJP") を行って、bash の環境変数を定義しておか
ねばならないのではないか、というつもりで書いたのですが。


とりあえず、挙動の原因は理解したつもりです。

 bash のソースの中では、LANG 等のロケール関連の環境変数が設定される度
 に、その都度、setlocale を実行している訳ですが、setlocale(LC_ALL, "") 
 の様に自分自身の環境変数の値を使用しているのではなく、
 setlocale(LC_ALL, sh_get_env_value("LANG")) のように、子プロセス用の
 環境変数を参照した上でロケールを設定しているので、readline 中で行って
 いる setlocale(LC_CTYPE, "") と不整合が起こる。

という理解でよろしいでしょうか?

で、考えたのですが、readline 中で setlocale() によってロケール設定を変
更する事自体が必要ないのではないでしょうか?

--- lib/readline/nls.c.bak      2001-10-16 03:32:29.000000000 +0900
+++ lib/readline/nls.c  2002-10-29 19:08:57.000000000 +0900
@@ -87,7 +87,8 @@
   char *t;
 
   /* Set the LC_CTYPE locale category from environment variables. */
-  t = setlocale (LC_CTYPE, "");
+  /* t = setlocale (LC_CTYPE, ""); */
+  t = setlocale (LC_CTYPE, NULL);
   if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0))
     {
       _rl_meta_flag = 1;

これでメッセージが ? になることもなく、コマンドラインの日本語も正しく
編集出来ます。いかがでしょう?

-- 
こいけ@じゃいすと(がくせい) <s-koike@xxxxxxxxxxx>