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コマンドやファイルソートで大文字小文字を考慮した辞書順になる。具体的には、Apple、apple、Banana、bananaの順序で表示される。
純粋な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$)"
注意事項
この方法は対症療法であり、根本的な原因(どこで空文字列が設定されているか)を解決するものではない。しかし、実用上は十分な解決策となる。
長期間使用しているシステムでは、様々なツールのインストール・アンインストールにより設定の断片が残存することがある。完全な解決を求める場合は、クリーンインストールが最も確実な方法である。