【解消】command not found地獄！パスを通すとは？

## 概要

ターミナルでよく聞く「パスを通す」とか「export PATH=...」って、最初はよく分からないですよね。
でもこれ、実は開発環境を快適に整えるうえでめちゃくちゃ重要な概念なんです。

この記事では、初心者にもわかりやすく「パスを通すってどういうこと？」「exportって何？」
という疑問をシェルの裏側で何が起きているのかにフォーカスしてまとめていこうと思います。

さらに、実際の設定ファイルの例や、よくあるトラブルとその対処法、開発現場での活用例なども盛り込み、理解を深めていきましょう。

---

## パスを通すの意味とは？

「パスを通す」とは、特定のディレクトリを`$PATH`という環境変数に追加することを意味します。これをしておくことで、そのディレクトリ内にあるコマンド（実行ファイル）を、どこにいても直接呼び出せるようになります。

例えば、`~/my_tools/bin/terraform` という実行ファイルがあるとき、パスを通していないとこう打つ必要があります：

```sh
~/my_tools/bin/terraform plan
```

でも、パスを通していれば：

```sh
terraform plan
```

で済むわけです。これが、毎回長いパスを書かずに済む「快適さ」の正体です。

パスを通すという操作は、**面倒なフルパス入力の手間を省き、どのディレクトリにいても一貫してコマンドを使えるようにする**という大きなメリットをもたらします。

---

## シェルが処理する流れ

ターミナルでコマンドを入力したとき、シェルは以下のような処理フローになっています。

1. ターミナルに `terraform` と入力
2. シェルが $PATH（OSやシェルがデフォルトで初期値を設定してくれている）に登録されたディレクトリを左から順に検索
3. 最初に見つかった `terraform` という名前の実行ファイルを発見！
4. それを実行

この一連の流れが、毎回ターミナルでコマンドを入力したときに自動で行われています。
$PATHは「コマンドを探す場所の一覧」が入ってる環境変数のことで、
例えば、ユーザーがシェルにhogeと入力してEnterを押すと、シェルは以下のような動きをします。

１. シェルが $PATH の中にあるディレクトリを、左から順に探す
（例：/usr/local/bin → /usr/bin → ...）

２. 各ディレクトリ内に hoge という実行可能なファイルがあるかをチェック

３. 見つかったら、それを実行し、見つからなかった場合は、以下を表示する
```
command not found: hoge
```

$PATHにどんな値が入っているかは
```
echo $PATH
```
で確認できるので、中身を確認しシェルがどのパスを探しにいくのか確認すると
理解が深まるでしょう。

## 実例：command not found が出たときの解決手順

以上までの知識をもとに `command not found` が表示されたとき、どうやって解決すればよいかをステップバイステップで紹介します。

### 例：`mytool` というコマンドを実行したが、以下のエラーが出た

```sh
zsh: command not found: mytool
```

### ステップ1：コマンドのインストール場所を確認する

```sh
find / -name mytool 2>/dev/null
```

### ステップ2：自分の使っているシェルを確認する

```sh
echo $SHELL
```

### ステップ3：対応する設定ファイルを開く

- bash の場合：`~/.bash_profile` または `~/.bashrc`
- zsh の場合：`~/.zshrc`

### ステップ4：PATH を通す

```sh
export PATH="/usr/local/mytool/bin:$PATH"
```

### ステップ5：設定を反映する

```sh
source ~/.zshrc  # または ~/.bash_profile
```

### ステップ6：再確認

```sh
which mytool
mytool --help
```

以上が解決手順になります。


---


## 補足

最後に補足となりますが、ここまでの解説でもよく分からないところがあると思いますので（筆者も初学時分からなかった部分）、ここにまとめておきます！

### `$` の有無の違い

$PATHという書き方の他にPATHという書き方もありますが、
この2つは何が違うんでしょうか。
実は以下のような違いがあります。

| 書き方 | 意味 |
|--------|------|
| `PATH=...` | 変数 `PATH` に値を**代入**する |
| `$PATH` | 変数 `PATH` の**中身を参照**する |

例えば次のような使い方がよくあります：

```sh
export PATH="$HOME/my_tools/bin:$PATH"
```

この例では、`$PATH` が右辺に使われていて「現在のPATHにさらにパスを追加する」構文になっています。

---
### `export PATH=...` と `PATH=...` の違い

exportの有無では、何が変わるのでしょうか。
この2つの違いは、環境変数のスコープ（有効範囲）にあります。
具体的には、以下の違いがあります。
- exportついていない場合：自分のシェルでしか使えない一時的な変数
- exportついている場合：**子プロセス（例えば新しく開いたシェル）にも引き継がれる環境変数**になる

たとえば次のように確認できます：

```sh
FOO=hello
bash
# 中に入ったシェルでは
echo $FOO  # → 何も表示されない
```

でも、

```sh
export FOO=hello
bash
# 表示される！
echo $FOO  # → hello
```

このように `export` された変数だけが子シェルでも使えるようになります。

---

### エクスポートするとは？

そもそもエクスポートするとはなんでしょうか。
`export` は、変数を単なるローカル変数から「環境変数」に昇格させる操作です。

環境変数とは、**プロセス間で共有できる設定情報**のこと。たとえば PATH や LANG、EDITOR などのシステム環境に関わる変数がこれに該当します。

エクスポートすることで、コマンドやアプリケーションがそれらの変数を認識できるようになります。

---

### エクスポートの情報はどこに保存される？

結論から言うと、**エクスポートした情報はメモリ上に一時的に保持されているだけ**です。

そのため、シェルを閉じれば情報は消えてしまいますし、再度起動したときには再設定が必要になります。

これが「パスを通したのに翌日には戻ってる！」という現象の正体です。

---

### 毎回起動時に自動でexportされてるのはなぜ？

毎回起動時に自動でexportされる理由は、`~/.bashrc` や `~/.zshrc` などの設定ファイルに `export` 文が書かれているからです。これらのファイルはターミナル起動時に自動d読み込まれます。

```sh
# ~/.zshrc の例
export PATH="$HOME/bin:$PATH"
```

ちなみに、設定ファイルを編集した直後に反映させたい場合は、以下のように `source` コマンドを使います。

```sh
# 変更をすぐに反映したいとき
source ~/.zshrc  # または source ~/.bashrc
```

この `source` コマンドは、シェルを再起動せずに設定を再読み込みするための便利な手段です。

---

## まとめ

- `PATH` はコマンドを探す場所のリスト
- `$PATH` はその中身を参照する記号
- `export` は変数を子プロセスにも共有させる宣言
- パスを通すことでどこからでもコマンドが呼べる
- 永続化したいときは `.bashrc` や `.zshrc` に書こう！
- `source` コマンドで設定を即時反映できる
- よくあるエラーもPATHの設定で解決できる

これらの知識が身につけば、シェル操作が一段と快適になります！