UbuntuやCentOSでBashログイン後に「warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)」が表示された場合の対処

はじめに

新しく導入したばかりの Linux サーバーに Bash でログインしたところ、次の様なメッセージが表示されるようになりました。

1
bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)

原因を解消すべく、対応したときのメモです。

実行環境

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ uname -a
$1 SMP PREEMPT Thu May 25 07:27:39 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

$ bash -version | head -n 1
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu

直前に行ったこと

直前に行なっていたことは、 .bashrc に環境変数を幾つか追加したことでした。 次の2行を追加していました。

1
2
export LANG='ja_JP.UTF-8'
export LC_ALL="${LANG}";

ロケールとは

ロケール ( locale ) とは、コンピューター上で使用される言語や地域に関する設定のことを指します。 具体的には、言語、文字コード、通貨、日付や時刻の書式などが含まれます。 ロケールは、ユーザーが使用する言語や地域に合わせて設定することで、コンピューター上で表示されるテキストや日付などが適切な形式で表示されるようになります。 Linux では、ロケールを設定するためのコマンドや設定ファイルが用意されており、ユーザーが自由に設定できます。

ロケール設定は先程登場した環境変数 LANGLC_ALL で設定します。

ロケール設定の環境変数は次の順序で優先されます。

  • LC_ALL
  • LC_XXX ( LC_で始まる環境変数 )
  • LANG

ちなみに LC_XXX 環境園数には次のようなものがあります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ locale 2>/dev/null | grep LC_
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"
LC_ALL=ja_JP.UTF-8

対処法

その1 : Debian 系 Linux で “language-pack-ja” パッケージを使う

language-pack-ja パッケージをインストールすることです。

1
2
3
$ apt update

$ apt install -y language-pack-ja

その2 : RedHat 系 Linux で “glibc-langpack-ja” パッケージを使う

1
2
3
$ yum update

$ yum install -y glibc-langpack-ja

その3 : Debian 系 Linux で “locales” パッケージを使う

「その1」の方法に比べてインストールするパッケージのサイズが小さいので、多少手数は増えますがこちらがおすすめ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ date
Mon Jan  1 23:01:31 UTC 2015

$ apt install -y locales

$ locale-gen ja_JP
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)
Generating locales (this might take a while)...
  ja_JP.UTF-8... done
Generation complete.

動作確認

ロケール設定が正しく動作するかを確認してみます。

環境変数 LANGLC_ALL を設定して date コマンドの実行した結果は次のようになります。 日本語ロケールで表示されていることがわかります。

1
2
3
4
5
6
$ export LANG='ja_JP.UTF-8'

$ export LC_ALL="${LANG}";

$ date
2015年  1月  1日 月曜日 23:02:55 UTC

ひとこと

これでログインしなおしてもエラーは出なくなりました。