-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory を解消する

まとめ

(1) .zshrc などで

export LC_CTYPE="ja_JP.UTF-8"

日本語ローカライズに非対応の場合は、

export LC_CTYPE="en_US.UTF-8"

(2) /etc/ssh/ssh_configSendEnv LANG LC_*コメントアウトする

経緯

ssh しようとして以下のエラーが出ることがある。

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

locale を見るとこのように LC_CTYPEUTF-8 となっている。エラーメッセージは UTF-8 という locale がないと言っている。

$ locale
LANG=""
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

macOS では Terminal.app 起動時に以下の設定がオンな場合、LC_CTYPE="UTF-8" に設定される。

ssh する際に ssh_configSendEnv LANG LC_* が有効で接続先の AcceptEnv LANG LC_* も有効な場合、LC_CTYPE="UTF-8"ssh 先にも送られる。接続先に UTF-8 がない場合は -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory とエラーになる。

このため解消するには、

  • .zshrc などで export LC_CTYPE する
  • ssh_configSendEnv LANG LC_* を無効にする
  • Terminal.app を使わない
  • Terminal.app の Set locale environment variables on startup をオフにする

という対策が考えられる。なお Terminal.app の設定を変えると日本語入力ができなくなるので注意。

私はたまに Terminal.app を使うのと、日本語ローカライズに対応している場合はその設定を使ってほしいので .zshrcexport LC_CTYPE="ja_JP.UTF-8" を書くことにした。

参考