PATHを通すの意味を理解する

# -
環境構築などでよく出てくる「PATHを通す」。
なんとなくコピペでやっていたがいつのまにかごちゃごちゃに。
しばらく環境構築でハマってるので、「まあ動いたからいいや」ではなくある程度理解できるまで学んでみる。

＊[こちら](https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015)の記事が大変参考になります。pathのことを理解してない人は本記事を読むよりこちらを読んだ方がためになります:raised_hands_tone2:


# 押さえどころ
「PATHを通す」の意味に関しては３つ重要なところを押さえておけば理解できる。

- 環境変数
- 設定ファイル
- PATH

# その１ -環境変数-

環境変数とはコンピューターが持っている変数。
名前から拒絶感があるがこれは避けては通れない。
じゃあ具体的に環境変数とは何か

例えばこれは変数

```shell:
A = "AppleのA"
B = "BananaのB"
C = "ChocolateのC"
```

変数Aをコンピューターで使いたい！っていう時にコンピューターに環境変数として登録すれば変数Aを参照できる。
このコンピューターに登録した変数が環境変数。

# その2 -設定ファイル-
次は環境変数をコンピューターに登録する方法。
まずコンソールで登録する場合はこんな感じ

```shell:
$ export A="AppleのA"
```
``export A="AppleのA``でEnterを押しても何も出てこない。
環境変数に登録されているか見てみる。
確認方法は

```shell:
$ printenv
A=りんごのA
...
...
...
```

または

```shell:
$ echo $A
AppleのA
```

ちゃんと登録されている。
``printenv``は一覧で表示してくれる。


``export``で登録し
``printenv``で一覧表示し
``echo``で変数を確認する。

別に難しいことではない。
ただ、コンソールを閉じると登録した変数が消えてしまう。
そこで永続的に保存するために設定ファイルに書く。
設定ファイルは

``.bash_profile``
``.bashrc``
のどちらかに書く。

＊この二つがわからなくて両方に書いていた、、

``.bash_profile``
>ログイン時に1回、実行される
具体的な用途は
- 環境変数を設定する(export する変数)


``.bashrc``
>シェル起動時に１回、実行される。
具体的な用途は
- 環境変数でない変数を設定する (export しない変数)
- エイリアスを定義する
- シェル関数を定義する
- コマンドライン補完の設定をする

ここら辺はまた別記事に詳しく書いていく。
今回は環境変数を設定してPathを通すので``.bash_profile``

コンソールで.bash_profileを開く
``$vi .bash_profile``
＊vimの使い方は別記事で書くかわからないので[こちら](https://qiita.com/yamazakim/items/f9da183e912a5333d1e4)の記事を参考に

.bash_profileを開いたらコードを書く。

```
export A="AppleのA"
```

コンソールで確認

```
echo $A
```

しかし何も表示されない。

.bash_profileを書き込んだあとは``source``コマンドで実行していく。

>source コマンドは実は、環境をリロードするためのものではない。
ファイルに書かれた内容を 忠実にコマンドとして実行していくものなのだ。


```
$source .bash_profile
```

もう一度確認

```
$echo $A
りんごのA
```

これで環境変数を永続的に設定できるようになった。

# その3 -PATH-
ここまできたら「PATHを通す」の意味をすぐ理解できる。

重要なのが**PATHも環境変数の一部**ということ
``printenv``で確認するとその中にPATHも入っていることがわかる。

PATHには

```
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

こんな感じで値が入っていて:で区切られている。
見やすくするとこんな感じ。

```
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
```
移動してみる。

```
$ cd usr/bin
```

するとよく使っている`cd`コマンドだったり`git`コマンドだったりが置かれている。
`git`コマンドを使うたびにわざわざ`git`を操作するプログラムが置かれている`usr/bin`まで行ってコマンドを実行するのはとんでもなく面倒臭い。

そこでPATHを通して**経路を作り**自分がどのディレクトリにいようともプログラム名だけで実行できるようにすることがPathを通すということ。

PATHが通っているからホーム画面にいても`cd`コマンドが使えるしわざわざプログラムが置いてある場所に行かなくてもよくなる。


実際に環境変数を設定してPATHを通してみる。
Pythonのバージョン管理、複数のバージョンを使い分けるコマンドラインツール、pyenvにPATHを通す。
-> [デフォルトシェルでPython3系を使いたい！ → pyenvを使ってみる](https://qiita.com/kazuppp/items/a0f04a7c217c048573cb)

まずコンソールで`pyenv`にPATHが通っている確認

```
$ pyenv version
pyenv: command not found
```
当然PATHが通っていないからそんなコマンドはないよと言われる。


`.bash_profile`を開き登録する

```
export PYENV_ROOT="\$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:\$PATH"
```
\$マークは環境変数を参照している。
\$HOMEはホームディレクトリを指す。
この場合は環境変数`PYENV_ROOT`を設定し環境変数PATHの前に追加して上書きしている。


`source`を実行

```
$ source .bash_profile
```

確認

```
$ pyenv version
3.7.0 (set by /Users/kazuppp/.pyenv/version)
```

PATHが通った！

# まとめ
- 環境変数はコンピューターが使える変数。
- 環境変数を登録しても設定ファイルに記述しないとコンソールを閉じた時に使えないので設定ファイルに書き永続化させる。
- 設定した環境変数をPATHに追加し上書きすることでPATHが通る。
- PATHは経路を作りプログラム名だけでプログラムを実行できる。

*＊環境変数を登録すると書いているが環境変数を設定するの方が正しいかもしれない。*

# 参考記事
- [Linux入門 ~「パスを通す」とは~](https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015)
- [環境変数PATHの通し方](http://rnakato.hatenablog.jp/entry/2017/10/14/172350)
- [もう迷わない！Mac、Linuxでパスを通すための環境変数の設定について](https://hodalog.com/how-to-add-a-directory-to-the-path/)
- [本当に正しい .bashrc と .bash_profile の使ひ分け](https://qiita.com/magicant/items/d3bb7ea1192e63fba850)
- [Linux — source コマンドは何をしているのか > 実は環境をリロードするためのものではない](https://qiita.com/YumaInaura/items/00437e6ab14d96adb71f)