7.8. Bash シェルの初期起動ファイル

シェルプログラムである /bin/bash (これ以降は単に 「シェル」 と表現します) は、初期起動ファイルをいくつも利用して環境設定を行います。 個々のファイルにはそれぞれに目的があり、ログインや対話環境を様々に制御します。 /etc ディレクトリにあるファイルは一般にグローバルな設定を行います。 これに対応づいたファイルがユーザーのホームディレクトリにある場合は、グローバルな設定を上書きします。

対話型ログインシェルは /bin/login プログラムを利用して /etc/passwd ファイルを読み込み、ログインが成功することで起動します。 同じ対話型でも非ログインシェルの場合は [prompt]$/bin/bash のようなコマンドラインからの入力を経て起動します。 非対話型のシェルはシェルスクリプト動作中に実行されます。 非対話型であるのは、スクリプトの実行の最中にユーザーからの入力を待つことがないためです。

より詳しい情報は info bashBash Startup Files and Interactive Shells の節を参照してください。

/etc/profile ファイルと ~/.bash_profile ファイルは、対話型のログインシェルとして起動した時に読み込まれます。

本節の終わりに示す /etc/profile ファイルは言語を設定するために必要となる環境変数を定義します。 これを設定することによって以下の内容が定められます。

以下において <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

上のコマンドを実行すると、言語名やロケールに応じたキャラクタエンコーディングが出力されます。 また通貨や各国ごとの国際電話番号プレフィックスも出力されます。 コマンドを実行した際に以下のようなメッセージが表示されたら、第6章にてロケールをインストールしていないか、あるいはそのロケールが Glibc のデフォルトのインストールではサポートされていないかのいずれかです。

locale: Cannot set LC_* to default locale: No such file or directory

このエラーが発生したら localedef コマンドを使って、目的とするロケールをインストールするか、別のロケールを選ぶ必要があります。 これ以降の説明では Glibc がこのようなエラーを生成していないことを前提に話を進めます。

LFS には含まれない他のパッケージにて、指定したロケールをサポートしていないものがあります。 例えば X ライブラリ (X ウィンドウシステムの一部) では、内部ファイルに指定されたキャラクタマップ名に合致しないロケールを利用した場合に、以下のようなメッセージを出力します。

Warning: locale not supported by Xlib, locale set to C

Xlib ではキャラクタマップはたいてい、英大文字とダッシュ記号を用いて表現されます。 例えば "iso88591" ではなく "ISO-8859-1" となります。 ロケール設定におけるキャラクタマップ部分を取り除いてみれば、適切なロケール設定を見出すことができます。 これはまた locale charmap コマンドを使って、設定を変えてみてロケールを指定してみれば確認できます。 例えば "de_DE.ISO-8859-15@euro" という設定を "de_DE@euro" に変えてみて Xlib がそのロケールを認識するかどうか確認してみてください。

これ以外のパッケージでも、パッケージが求めるものとは異なるロケール設定がなされた場合に、適切に処理されないケースがあります。 (そして必ずしもエラーメッセージが表示されない場合もあります。) そういったケースでは、利用している Linux ディストリビューションがどのようにロケール設定をサポートしているかを調べてみると、有用な情報が得られるかもしれません。

適切なロケール設定が決まったら /etc/profile ファイルを生成します。

cat > /etc/profile << "EOF"
# Begin /etc/profile

export LANG=<ll>_<CC>.<charmap><@modifiers>

# End /etc/profile
EOF

ロケール設定の 「C」 (デフォルト) と 「en_US」 (米国の英語利用ユーザーに推奨) は異なります。 「C」 は US-ASCII 7 ビットキャラクタセットを用います。 もし最上位ビットがセットされたキャラクタがあれば不適当なものとして取り扱います。 例えば ls コマンドにおいてクエスチョン記号が表示されることがあるのはこのためです。 また Mutt や Pine などにより電子メールが送信される際に、そういった文字は RFC には適合しないメールとして送信されます。 送信された文字は 「不明な 8ビット (unknown 8-bit)」 として示されます。 そこで 8ビット文字を必要としない場合には 「C」 ロケールを指定してください。

UTF-8 ベースのロケールは多くのプログラムにおいてサポートされていません。 この問題については http://www.linuxfromscratch.org/blfs/view/svn/introduction/locale-issues.html にて説明しており、可能なものは解決を図っていこうとしているところです。