Macのターミナルでスーパーユーザーでログインする時だけ、日本語が???になり、かな入力が拒否される問題の解決策


問題の現象

Macのターミナル起動時のユーザーの状態では、かなモードで日本語入力ができます。ところが、suコマンドでrootとしてログインした途端、日本語のファイル名は????になり、かなモードが入力拒否される状態になりました。

症状の詳細

起動時のユーザーではかな入力が可能、日本語も表示される

ターミナル起動時のユーザーでは問題なくかなモードでの入力が可能でした。
localeコマンドでも以下の通り、UTF-8になっています。

$ locale

LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=

ところが、スーパーユーザーだとかな入力は拒否され、日本語は?????と表示される…

rootでlocaleコマンドを入力すると、以下のようにCになっています。

# locale

LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

この状態でlsコマンドで確認すると日本語のファイ名が???で表示されました。

?????????.png

解決への手順

① ターミナルの環境設定の詳細の確認

Control+Vで非ASCⅡ入力をエスケープはチェックが外れていること。
テキストエンコーディングがUTF-8になっていること。

② .bash_profileを作成(日本語を表示させる)

.bash_profileとは、bashログインシェル時に1回は実行されるファイルです。
こちらに、日本語を表示させるための記述をしておきます。
作成場所は、rootの$HOME直下です。
最初からない場合が多く、viで.bash_profileを作成し、以下を追記します。

作成場所は、rootの$HOME直下です。
最初からない場合は、viで.bash_profileを作成し、以下を追記します。

cdコマンドでHOMEへ移動します。
# cd $HOME

viコマンドで.bash_profileを作成します。
# vi .bash_profile

次のように記述します。

.bash_profile
export LC_ALL=ja_JP.UTF-8
export LANG=ja_JP.UTF-8

その次に、sourceコマンドで実行させます。
# source ~/.bash_profile

localeコマンドで確認すると、変更されていることが確認できます。
# locale

LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL="ja_JP.UTF-8"

この直後から、ファイル名は日本語で表示されるようになります。

ところが、問題が2つ残りました。
1つ目は、かなモードでは入力拒否される問題。
2つ目は、.bash_profileが起動時に実行されない問題。
なので、スーパーユーザーをログアウトし、ログインし直すと…日本語が????と表示され、sourceコマンドを毎度使用しなくてはなりませんでした。

③ .profileを作成(日本語を表示させる)

.bash_profileが読み込まれない問題がある方は、.profileに②と同様の記述をすると日本語表示の問題は解決します。

Appleのデベロッパーに以下の説明があります。
https://developer.apple.com/library/archive/documentation/OpenSource/Conceptual/ShellScripting/BeforeYouBegin/BeforeYouBegin.html#//apple_ref/doc/uid/TP40004268-CH1-SW15
(Google翻訳より引用)

Bourneシェル(bash、zshなど):
環境変数を永続的に設定してエイリアスを追加するには、適切なalias 、変数の割り当て、およびexportコマンドを次のファイルに追加できます。
~/.profile —すべてのログインシェルに対して自動的に実行されます。
~/.bash_profile — .profileに似ていますが、 bashログインシェルでのみ実行されます。
~/.bashrcおよび~/.zshrcすべての非ログインbashまたはzshシェル~/.bashrc自動的に実行されます(コマンドラインでbashまたはzshを明示的に入力するか、 #!/bin/bashまたは#!/bin/zshで始まるスクリプトを実行した場合) #!/bin/zsh )。

つまり、exportコマンドを追加できることが保証されており且つ.profileの方がすべてのログインシェルに対して自動的に実行されるということは、.bash_profileよりもどのログイン方法でも確実に読み込まれると解釈できます。

作成場所は、rootの$HOME直下です。
元からない場合は、viで.profileを作成し、以下を記述します。

.profile
export LC_ALL=ja_JP.UTF-8
export LANG=ja_JP.UTF-8

次に、スーパーユーザーをログアウトして再ログインして、localeコマンドで確認するとUTF-8になっており、日本語が表示されるようになりました。
念のため、②で作成した.bash_profileの中の記述は削除しておきました。(ファイルだけ残してあります。)

日本語表示に関しては解決したとは言え、bash_profileが読み込まれないことは動作としておかしいので、気持ちが悪いですね。

④ .inputrcを作成(日本語入力を出来るようにする)

コマンドラインで日本語を表示、使用したい時のreadlineの設定になります。
こちらをすることで、かなモードでの入力拒否がされなくなります。

作成場所は同じく、rootの$HOME直下です。
viコマンドで.inputrcを作成します。
# vi .inputrc

次のように記述します。

.inputrc
set convert-meta off
set input-meta on
set output-meta on

そして、bindコマンドで読み込みます。
オプション -f の意味は、「指定したinputrc書式のファイルからキーバインドなどの設定を読み込む(有効にする)」です。

# bind -f .inputrc

すると、日本語入力ができるようになりました!

課題残る…

bashログインシェル時に1回は実行されるはずの.bash_profileが実行されない問題が残ってしまいました。
どなたか、解決策をご存知の方がいらっしゃったら、ご教授頂けると幸いです。