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

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



わかった。おそらくbashのバグ

At Tue, 29 Oct 2002 13:09:09 +0900,
Tomohiro KUBOTA wrote:

> bash にあてるパッチはまだ試してません。

さっきのパッチではだめです。
添付のパッチでなおるはず。
 
> bash のソースはまだ見たことがありませんが、印象としては、LANG=hogehoge
> と入力するとその影響がすぐに現れる (gettext の言語とエンコーディング、
> readline のエンコーディングが直ちに変更される) ための機構がどこかに
> あるはずで、~/.bashrc などのスタートアップスクリプトの処理の際には
> その機構がバイパスされているかうまく働いていないのではないか、という
> 気がしています。ソースを読んでないので憶測にすぎませんが。なお、
> (1)(2) の問題が現れている状態のシェル上で source ~/.bashrc すると、
> 直接 LANG=hogehoge と入力したのと同様、(1)(2) とも正常動作となる
> ことを確認しました。

状況)
 1) ~/.bashrc の LANG=ja_JP.eucJP が処理される
   => setlocale(LC_ALL, "ja_JP.eucJP")

 2) terminalの初期化段階で lib/readline/nls.c の以下の関数が呼ばれる
   => setlocale(LC_CTYPE, "");
      ここでは bashそれ自体の環境変数 LANGなどは C のままなので
      setlocale(LC_CTYPE, "C"); のように処理され、codesetがCに
      されてしまうが、LC_CTYPEだけなので LC_MESSAGEなどはja_JPのまま

 3) strerror() で gettext()
   => ja_JP なメッセージを codeset C で処理しようとして ????

--- bash-2.05b.orig/lib/readline/nls.c	2001-10-16 03:32:29.000000000 +0900
+++ bash-2.05b/lib/readline/nls.c	2002-10-29 14:36:46.000000000 +0900
@@ -85,9 +85,14 @@
    value, and go into eight-bit mode if it's not C or POSIX. */
 #if defined (HAVE_SETLOCALE)
   char *t;
+  char *lspec;
 
+  lspec = sh_get_env_value("LC_ALL");
+  if (lspec == 0) lspec = sh_get_env_value("LC_CTYPE");
+  if (lspec == 0) lspec = sh_get_env_value("LANG");
   /* Set the LC_CTYPE locale category from environment variables. */
-  t = setlocale (LC_CTYPE, "");
+  // t = setlocale (LC_CTYPE, "");
+  t = setlocale (LC_CTYPE, lspec);
   if (t && *t && (t[0] != 'C' || t[1]) && (STREQ (t, "POSIX") == 0))
     {
       _rl_meta_flag = 1;

-- 
鵜飼文敏