環境変数の中には、ネイティブな言語サポートのために必要になるものがあります。 これを設定することによって以下の内容が定められます。
プログラムの出力結果を指定した言語で得ることができます。
キャラクターを英字、数字、その他のクラスに分類します。 この設定は、英語以外のロケールにおいて、コマンドラインに非アスキー文字が入力された場合に bash が正しく入力を受け付けるために必要となります。
各国ごとに正しくアルファベット順が並ぶようにします。
適切なデフォルト用紙サイズを設定します。
通貨、日付、時刻を正しい書式で出力するように設定します。
以下において <ll>
と示しているものは、言語を表す2文字の英字 (例えば en
) に、また
<CC>
は、国を表す2文字の英字
(例えば GB
) にそれぞれ置き換えてください。 <charmap>
は、選択したロケールに対応したキャラクターマップ (charmap) に置き換えてください。 オプションの修飾子として
@euro
といった記述もあります。
以下のコマンドを実行すれば Glibc が取り扱うロケールを一覧で見ることができます。
locale -a
キャラクターマップにはエイリアスがいくつもあります。 例えば ISO-8859-1
は iso8859-1
や iso88591
として記述することもできます。
ただしアプリケーションによってはエイリアスを正しく取り扱うことができないものがあります。 (UTF-8
の場合 UTF-8
と書かなければならず、これを utf8
としてはならない場合があります。)
そこでロケールに対する正規の名称を選ぶのが最も無難です。 正規の名称は以下のコマンドを実行すれば分かります。 ここで <locale name>
は locale -a コマンドの出力から得られたロケールを指定します。
(本書の例では en_GB.iso88591
としています。)
LC_ALL=<locale name>
locale charmap
en_GB.iso88591
ロケールの場合、上のコマンドの出力は以下となります。
ISO-8859-1
出力された結果が en_GB.ISO-8859-1
に対するロケール設定として用いるべきものです。 こうして探し出したロケールは動作確認しておくことが重要です。 Bash
の起動ファイルに記述するのはその後です。
LC_ALL=<locale name> locale language LC_ALL=<locale name> locale charmap LC_ALL=<locale name> locale int_curr_symbol LC_ALL=<locale name> locale int_prefix
上のコマンドを実行すると、言語名やロケールに応じたキャラクターエンコーディングが出力されます。 また通貨や各国ごとの国際電話番号プレフィックスも出力されます。 コマンドを実行した際に以下のようなメッセージが表示されたら、第 8 章にてロケールをインストールしていないか、あるいはそのロケールが Glibc のデフォルトのインストールではサポートされていないかのいずれかです。
locale: Cannot set LC_* to default locale: No such file or directory
このエラーが発生したら localedef コマンドを使って、目的とするロケールをインストールするか、別のロケールを選ぶ必要があります。 これ以降の説明では Glibc がこのようなエラーを生成していないことを前提に話を進めます。
これ以外のパッケージでも、パッケージが求めるものとは異なるロケール設定がなされた場合に、適切に処理されないケースがあります。 (そして必ずしもエラーメッセージが表示されない場合もあります。) そういったケースでは、利用している Linux ディストリビューションがどのようにロケール設定をサポートしているかを調べてみると、有用な情報が得られるかもしれません。
適切なロケール設定が決まったら /etc/locale.conf
ファイルを生成します。
cat > /etc/locale.conf << "EOF"
LANG=<ll>_<CC>.<charmap><@modifiers>
EOF
シェルプログラムである /bin/bash
(これ以降は単に「シェル」と表現します) は、初期起動ファイルをいくつも利用して環境設定を行います。
個々のファイルにはそれぞれに目的があり、ログインや対話環境をさまざまに制御します。 /etc
ディレクトリにあるファイルは一般にグローバルな設定を行います。
これに対応づいたファイルがユーザーのホームディレクトリにある場合は、グローバルな設定を上書きします。
対話型ログインシェルは /bin/login
プログラムを利用して /etc/passwd
ファイルを読み込み、ログインが成功することで起動します。 同じ対話型でも非ログインシェルの場合は [prompt]$
/bin/bash のようなコマンドラインからの入力を経て起動します。
非対話型のシェルはシェルスクリプト動作中に実行されます。
非対話型であるのは、スクリプトの実行の最中にユーザーからの入力を待つことがないためです。
ログインシェルは /etc/locale.conf
における設定に影響を受けないこともあります。
/etc/locale.conf
のロケール設定を読み込んでエクスポートするために /etc/profile
を生成します。 , ただし Linux コンソールの起動中は、上ではなく C.UTF-8
を設定します。 (Linux
コンソールが表示できない文字を出力しないようにするためです。)
cat > /etc/profile << "EOF"
# Begin /etc/profile
for i in $(locale); do
unset ${i%=*}
done
if [[ "$TERM" = linux ]]; then
export LANG=C.UTF-8
else
source /etc/locale.conf
for i in $(locale); do
key=${i%=*}
if [[ -v $key ]]; then
export $key
fi
done
fi
# End /etc/profile
EOF
/etc/locale.conf
ファイルは systemd
のユーティリティープログラム localectl を使って定めることもできます。
例えば上と同じ設定を行うには以下を実行します。
localectl set-locale LANG="<ll>_<CC>.<charmap><@modifiers>
"
言語に関連する環境変数、例えば LANG
, LC_CTYPE
, LC_NUMERIC
などや、locale
が出力する環境変数を指定することもできます。 その場合は各設定をスペースにより区切ります。 例として LANG
を en_US.UTF-8 とし LC_CTYPE
を単に en_US とする場合は以下のようにします。
localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"
localectl コマンドは chroot 環境内では動作しない点に注意してください。 systemd を使って LFS システムを起動したときになって、初めて利用できるものです。
ロケール設定の C
(デフォルト) と en_US
(米国の英語利用ユーザーに推奨) は異なります。 C
は US-ASCII 7 ビットキャラクターセットを用います。
もし最上位ビットがセットされたキャラクターがあれば不適当なものとして取り扱います。 例えば ls
コマンドにおいてクエスチョン記号が表示されることがあるのはこのためです。 また Mutt や Pine
などにより電子メールが送信される際に、そういった文字は RFC には適合しないメールとして送信されます。 送信された文字は
unknown 8-bit
(不明な 8ビット) として示されます。
そこで 8ビット文字を必要としないことが明らかな場合には C
ロケールを指定してください。