[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>