MENU

macOSでBash起動時のロケール警告を解決する方法

macOSでシェルをfishからbashに変更した際、ターミナル起動時に以下のような警告が表示されることがある。

-bash: 警告: setlocale: LC_COLLATE: cannot change locale (): No such file or directory

この警告は機能上の問題を引き起こすわけではないが、毎回表示されるため作業の邪魔になる。本記事では、この警告を解消する対症療法的な解決方法を記録する。

目次

環境

  • macOS(Homebrewでbashをインストール済み)
  • シェルをfishからbashに変更後
  • /opt/homebrew/bin/bashを使用

問題の原因分析

現在のロケール設定の確認

まず、現在のロケール設定を確認する。

locale

問題がある場合、以下のような出力になることが多い。

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

環境変数の確認も行う。

env | grep -E "(LANG|LC_)"

このコマンドで表示される内容とlocaleコマンドの出力に不一致がある場合、設定の競合が発生している可能性が高い。

根本原因の推定

警告メッセージのcannot change locale ():の括弧内が空になっているのは、どこかでロケール関連の環境変数が空文字列に設定されているためである。これは以下のような要因で発生する可能性がある。

  • 以前使用していたシェル(fish等)の設定残骸
  • システムアップデート時の設定の不整合
  • 複数のツールによる環境変数の競合

解決方法

基本的な対症療法

個人用の設定ファイルを作成し、明示的にロケールを設定する。これにより、不完全な設定を上書きできる。

echo 'export LANG=en_US.UTF-8' > ~/.bash_profile

設定を即座に反映させる。

source ~/.bash_profile

設定内容の選択指針

ロケール設定には以下の選択肢がある。

英語環境での自然な並び順を優先する場合(推奨)

export LANG=en_US.UTF-8

この設定により、lsコマンドやファイルソートで大文字小文字を考慮した辞書順になる。具体的には、AppleappleBananabananaの順序で表示される。

純粋なASCII順序を優先する場合

export LANG=C

この設定では、ASCII値順(数字→大文字→小文字)でソートされる。プログラマー向けの厳密な順序だが、一般的な用途では直感的でない順序になることがある。

設定の確認

設定後、新しいターミナルを開いて以下を確認する。

locale

すべてのLC_*項目が設定したロケール(例:en_US.UTF-8)になっていれば成功である。また、警告メッセージが表示されなくなることを確認する。

追加の対処法

ターミナルアプリ固有の設定確認

一部のターミナルアプリケーションは独自の設定ファイルを持つ場合がある。

cat "/etc/bashrc_$TERM_PROGRAM" 2>/dev/null || echo "Terminal-specific bashrc not found"

利用可能なロケールの確認

システムでサポートされているロケールを確認したい場合は以下を実行する。

locale -a | grep -E "(en_US|ja_JP|C$)"

注意事項

この方法は対症療法であり、根本的な原因(どこで空文字列が設定されているか)を解決するものではない。しかし、実用上は十分な解決策となる。

長期間使用しているシステムでは、様々なツールのインストール・アンインストールにより設定の断片が残存することがある。完全な解決を求める場合は、クリーンインストールが最も確実な方法である。

参考資料

目次