Debianでrootだけlocaleが間違っていると思ったらとってもギルティだった話。
聞いてくれや、事の顛末を。
print('あいうえお')
とかやってみようとすると
root@sv1:~# python Python 3.5.3 (default, Sep 27 2018, 17:25:39) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print('あいうえお') File "<stdin>", line 0 ^ SyntaxError: 'ascii' codec can't decode byte 0xe3 in position 7: ordinal not in range(128) >>> root@sv1:~#
こんなことになる。
同じ構成にしているはずの別サーバーでは
root@sv2:~# python Python 3.5.3 (default, Sep 27 2018, 17:25:39) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print('あいうえお') あいうえお >>> root@sv2:~#
普通にうまく行く。
「なんでやねん!!!」と思って標準出力のエンコーディングを見て見ると
root@sv1:~# python Python 3.5.3 (default, Sep 27 2018, 17:25:39) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> print(sys.stdout.encoding) ANSI_X3.4-1968 >>> root@sv1:~#
こりゃまたどうしてこんなことに…
もしやと思い、おもむろにlocale
と叩いてみると
root@sv1:~# locale LANG=C LANGUAGE= 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= root@sv1:~#
∩(´;ヮ;`)∩ンヒィ~~~~~~~~~~~~~~~~~~~~
そういえばこのサーバー、インストールの時間違えてen_US.utf8
を選ぶつもりがC
を選んじゃったんだった…
でもその後直した気がするのでもう少し調べてみる。
root@sv1:~# cat /etc/default/locale LANG=en_US.UTF-8 root@sv1:~#
既に設定されている。
現に一般ユーザーでは問題ない
【ひみつだよ】$ locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= 【ひみつだよ】$
…は?
たねあかし。
rootだけということは、きっとrootのbash profileあたりがおかしいんだろう…
root@sv1:~# cat ~/.profile # ~/.profile: executed by Bourne-compatible login shells. if [ "$BASH" ]; then if [ -f ~/.bashrc ]; then . ~/.bashrc fi fi mesg n || true # Installed by Debian Installer: # no localization for root because C # cannot be properly displayed at the Linux console LANG=C LANGUAGE=C root@sv1:~#
コラコラコラコラ~ッ!(`o´)
おまえなんでそんなとこに書いとんねん!!
ちなみに問題ないサーバーではこんなの無い。
root@sv2:~# cat ~/.profile # ~/.profile: executed by Bourne-compatible login shells. if [ "$BASH" ]; then if [ -f ~/.bashrc ]; then . ~/.bashrc fi fi mesg n || true root@sv2:~#
マジで何のために書いてあるんこれ…
と言うわけで直すよ。
root@sv1:~# vi ~/.profile root@sv1:~# cat ~/.profile # ~/.profile: executed by Bourne-compatible login shells. if [ "$BASH" ]; then if [ -f ~/.bashrc ]; then . ~/.bashrc fi fi mesg n || true root@sv1:~# logout 【ひみつだよ】@sv1:~$ su - Password: root@sv1:~# locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= root@sv1:~# python Python 3.5.3 (default, Sep 27 2018, 17:25:39) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> print('あいうえお') あいうえお >>> root@sv1:~#
直った。
結局あれ、なんのためやったん?
~/.profile
にはこんなことが書いてあった。
# Installed by Debian Installer: # no localization for root because C # cannot be properly displayed at the Linux console
翻訳すると、こう。
Debianインストーラによってインストールされます。
Cのため、root用のローカライゼーションはありません。
Linuxコンソールに正しく表示されない
要はシステムがC
になってるとコンソールがちゃんと表示されないからその対策ってこと…?
┐(´ー`)┌ さっぱりわかんないよ