[[dotfiles]] でパスを指定するとき、`/Users/tanu/` のような絶対パスをハードコードしてはいけない。代わりに `$HOME` などの環境変数を使う。
## 問題: ハードコードされたパスは移植できない
```bash
# NG: 特定のユーザー名がハードコードされている
if [ -f '/Users/tanu/google-cloud-sdk/path.zsh.inc' ]; then
. '/Users/tanu/google-cloud-sdk/path.zsh.inc'
fi
```
このコードは `/Users/tanu/` でしか動作しない。別のユーザー名や Linux 環境 (`/home/tanu/`) では失敗する。
## 解決策: 環境変数を使う
```bash
# OK: 環境変数で動的に解決
if [ -f "$HOME/google-cloud-sdk/path.zsh.inc" ]; then
. "$HOME/google-cloud-sdk/path.zsh.inc"
fi
```
`$HOME` はシェルが自動的に現在のユーザーのホームディレクトリに展開する。
## パスの種類
| 種類 | 例 | 用途 |
|------|-----|------|
| ハードコードされた絶対パス | `/Users/tanu/foo` | 避けるべき |
| 環境変数を使ったパス | `$HOME/foo` | dotfiles で推奨 |
| 相対パス | `./foo` | 実行場所に依存するため設定ファイルには不向き |
## 関連ノート
- **[前提]** [[dotfiles リポジトリはシンボリックリンクで設定ファイルを管理する]]: 本ノートのパス指定はこのリンク管理の文脈で意味を持つ
- **[派生]** [[Shell のシングルクオートとダブルクオートの違い]]: 本ノートで使う `$HOME` を展開するにはダブルクオートが必要なため併読する
- **[派生]** [[dotfiles ではインストール対象を宣言的な設定ファイルで管理する]]: 本ノートのパス方針と並ぶ、dotfiles のポータビリティ向上策