概要
- PATH 設定時の ~(チルダ)展開 の落とし穴について解説
- .bashrc や .zshrc での PATH 追加時の注意点
- ~ を使った場合の予期せぬ挙動とその理由
- $HOME を使った安全な記述方法の紹介
- PATH の確認方法と修正手順
PATH設定時の~(チルダ)展開に関する注意
- .bashrc や .zshrc で export PATH="$PATH:~/.local/bin/" のように記述すると、 ~ が正しく ホームディレクトリ に展開されない場合が多い
- Bash や Zsh では、 チルダ展開 は アンコーテッド(クォートされていない)~ にのみ適用
- クォート された~は、そのままの文字列として扱われ、 /home/<user>/.local/bin/ ではなく ./~/.local/bin/ となる危険性
- PATH に ./~/.local/bin/ が追加されることで、意図しないディレクトリが参照されるリスク
- $HOME を使った export PATH="$PATH:$HOME/.local/bin/" が安全な記述方法
Bashドキュメントにおけるチルダ展開の仕様
- Bash公式ドキュメント では、 アンコーテッドの~ のみが チルダ展開 対象と明記
- 変数代入 時や :(コロン) の直後で アンコーテッド~ が現れると展開される仕様
- export PATH=$PATH:~/.local/bin のような記述は Bash や Zsh で展開されるが、 ホワイトスペース が混入すると失敗する脆弱性
- クォート すると展開されず、意図しないディレクトリがPATHに追加される事例
実際の挙動と再現例
- mkdir -p ./~/.local/bin/ で カレントディレクトリ 配下に ~/.local/bin/ ディレクトリ作成
- gcc で ./~/.local/bin/kek バイナリを作成し、 PATH="~/.local/bin/" kek で実行
- tree -f . で ./~/.local/bin/kek が実行されたことを確認
- ホームディレクトリ ではなく、 カレントディレクトリ 配下の ~/.local/bin/ が参照された実例
PATHの確認方法と修正手順
- echo "$PATH" | grep -- '~' で PATH 内に ~ が含まれているか確認
- echo "$PATH" | tr ':' '\n' | grep '~' で 各PATHエントリ を1行ずつ表示し、 ~ の有無を確認
- ~ が表示された場合は、 .bashrc/.zshrc/.profile 内の該当記述を $HOME で置換し修正
nonoツールの警告について
- nono agent sandboxing tool は PATH に書き込み可能なエントリとして ~/.local/bin/ を警告
- この警告により、 PATH設定ミス や 意図しないディレクトリ参照 を未然に防止
- 警告文 をより詳細にする提案(PR)も進行中
まとめ
- PATH 設定時は ~ の展開挙動に注意
- $HOME を明示的に使うことで安全性向上
- PATH の内容を定期的に確認し、不要・危険なエントリを除去
- nono などのツールによる警告も有効活用