UbuntuやCentOSでBashログイン後に「warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)」が表示された場合の対処
はじめに
新しく導入したばかりの Linux サーバーに Bash でログインしたところ、次の様なメッセージが表示されるようになりました。
bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)
原因を解消すべく、対応したときのメモです。
実行環境
$ 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行を追加していました。
export LANG='ja_JP.UTF-8'
export LC_ALL="${LANG}";
ロケールとは
ロケール ( locale ) とは、コンピューター上で使用される言語や地域に関する設定のことを指します。
具体的には、言語、文字コード、通貨、日付や時刻の書式などが含まれます。
ロケールは、ユーザーが使用する言語や地域に合わせて設定することで、コンピューター上で表示されるテキストや日付などが適切な形式で表示されるようになります。
Linux では、ロケールを設定するためのコマンドや設定ファイルが用意されており、ユーザーが自由に設定できます。
ロケール設定は先程登場した環境変数 LANG
や LC_ALL
で設定します。
ロケール設定の環境変数は次の順序で優先されます。
LC_ALL
LC_XXX
( LC_で始まる環境変数 )LANG
ちなみに LC_XXX
環境園数には次のようなものがあります。
$ 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
パッケージをインストールすることです。
$ apt update
$ apt install -y language-pack-ja
その2 : RedHat 系 Linux で "glibc-langpack-ja" パッケージを使う
$ yum update
$ yum install -y glibc-langpack-ja
その3 : Debian 系 Linux で "locales" パッケージを使う
「その1」の方法に比べてインストールするパッケージのサイズが小さいので、多少手数は増えますがこちらがおすすめ。
$ 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.
動作確認
ロケール設定が正しく動作するかを確認してみます。
環境変数 LANG
、 LC_ALL
を設定して date
コマンドの実行した結果は次のようになります。
日本語ロケールで表示されていることがわかります。
$ export LANG='ja_JP.UTF-8'
$ export LC_ALL="${LANG}";
$ date
2015年 1月 1日 月曜日 23:02:55 UTC
ひとこと
これでログインしなおしてもエラーは出なくなりました。
ディスカッション
コメント一覧
まだ、コメントがありません