yuicho@brain:~# tail -f /dev/memory

備忘録。このブログについては https://yuicho.hateblo.jp/about を見やがれ。

Debianでrootだけlocaleが間違っていると思ったらとってもギルティだった話。

聞いてくれや、事の顛末を。

python

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になってるとコンソールがちゃんと表示されないからその対策ってこと…?

┐(´ー`)┌ さっぱりわかんないよ