試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

環境変数LC_ALLは未定義のほうがよい?ロケール用環境変数について

環境変数LC_ALLがセットされていると、ロケールに間する環境変数を一括で指定できて便利なのだが、

$ LC_TIME=C mc

などとしても、ロケール用の環境変数(上の例ではLC_TIME)が反映されない。
Gentoo Linux Documentation -- Gentoo Linux ローカライズガイド
によると、LC_ALLが他の環境変数を上書きしてしまう(優先順位が最も高いとも言える)ようだ。

上書きされてしまう例としては、

$ LC_ALL=C gkrellm2

とした場合、日付の書式を英語にできるのだが、LC_MESSAGESも変更されてしまい、ユーザインターフェースまで英語になってしまう。

$ env -u LC_ALL LC_TIME=C gkrellm2

もしくは

$ LC_ALL= LC_TIME=C gkrellm2

とすることで、メッセージを日本語にしつつ、日付の書式のみ英語にすることができる。なお、${LC_ALL}が未定義の場合、「env -u LC_ALL」や「LC_ALL=」の記述は不要。

なお、現在のロケール関係の環境変数の設定としては、以下のようにしている。
(2007/7/14)「LC_ALL=""」「LC_ALL=」と書くと空文字列がセットされ、一部アプリケーションやコマンドで英語になることがあるため、未定義のまま書かないよう修正
ファイル名: /etc/env.d/02locale

LANG="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"

環境変数の意味について

(2008/8/30)各環境変数についての説明はsetlocale()関数のマニュアルページなどを参照。
(2014/9/21)上のリンク先を修正

上書きされる環境変数とされない環境変数

(2009/6/23)LC_ALLを指定すると「LC_」の付く環境変数は全て上書きされるが、LANGは変わらないということを付け加えておく。元々のLANGが「ja_JP.UTF-8」のとき、LC_ALLを別の値にしても

$ LC_ALL=C locale
LANG=ja_JP.UTF-8
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

のようになる。