Macでパスを通すコマンドを深掘りして解説

春ですね😊
何か新しいことを始めたくなる、そんな季節。
「どれ、最近流行りのプログラミングとやらに挑戦してみようか」
そして高い確率で出てくるのがこれ

```ターミナル.sh
echo 'export PATH=$PATH:`pwd`/path/to/bin' >> ~/.zshrc
```

### このコマンドの嫌なところ

- 記事によって書き方が違う
- 自分のやりたい事によって違う


# 解説

改めて例のコマンドを見てみましょう。

```ターミナル.sh
echo 'export PATH=$PATH:`pwd`/path/to/bin' >> ~/.zshrc
```


このコマンドは大きく分けて2つの命令の合体です

-  ```echo A >> B```
-  ```export C=D```

これが合体して ```echo 'export C=D' >> B``` の形になっています。

## echo
```echo A >> B``` と書くとA(文字)をB(ファイル)に追加で書き込むことができます。

例えばここに適当なファイルがあります。
![適当なファイル変更前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/fcc81df8-b07e-6cb5-afb1-1ef2b2d9cb61.png)

コマンドを実行すると...
![echo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/b04b844d-3d02-8622-fa35-08f6217bae50.png)

文字が増えていますね☺️
![適当なファイル変更後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/3dca0cbe-fd31-5150-aa47-46d8715bd6ab.png)

実際には ```echo A >> ~/.zshrc``` となっているので
`~/.zshrc` というファイルの中身の文字が増えている予想がつきます。試しに覗いてみましょう。
![zshrc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/581b2945-a3c2-b164-49c2-7bdde059d28a.png)

ふむふむ、やっぱり下に行が増えていましたね。

<br />

書き込まれたのは `export`コマンドです
**コマンドを使ってコマンドを書き込んだ** と言うことです


この `~/.zshrc` というファイルにコマンドを書いておくと、毎回ターミナルを開いたときに自動的に実行してくれます。
つまり毎回ターミナルを開くたびに ```export C=D``` と書くのが面倒なので `~/.zshrc` に書き込んだと言うことです

:::note warn
何年か前のMacを使っている人は  `~/.zshrc` ではなく `~/.bash_profile` です。
:::

## export

```export C=D``` と書くと **環境変数** が作られます


このコマンドを日本語に翻訳すると...

```ターミナル.sh

$ ねぇ、パソコン君。 貯金箱 の中身を見せて
🖥 貯金箱? 何それどこにあるの? (エラー)


# PATHという 環境変数 を作っておく
$ export PATH=/自宅/私の部屋/机/引き出しの中/貯金箱


$ ねぇ、パソコン君。 貯金箱 の中身を見せて
🖥 了解！
50円玉 12枚
100円玉 36枚
500円玉 8枚

```

<br />

さて、実際のコマンドを改めてみると、

```
export PATH=$PATH:`pwd`/path/to/bin
```

なので、日本語の `/自宅/私の部屋/机/引き出しの中/貯金箱` の部分が ```$PATH:`pwd`/path/to/bin``` になったものですね


<br />
<br />
<br />
<br />

もう少し、あと少しだけ頑張って読んでいただければ幸いです。😭
さらに細かく考えます。```$PATH:`pwd`/path/to/bin``` を分すると...

- ``` `pwd` ```
- `/path/to/bin`
- `$PATH:`

<br />

### \`pwd\`

これは私が今いるパソコンの中の場所を表します。単品のコマンドとしても使えます。

![pwd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/7a2d2d6e-5230-57e5-6068-df2e2012ea1f.png)

![pwd_stdout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/b3279c58-5142-3415-cfb9-9f41779b0c9e.png)

どうやら現在私はパソコンの中の **/usr/local** という場所にいるようです。
ここは人によって違ってきます。

- ~~\`pwd\`~~ 👍OK
- /path/to/bin 👈次
- $PATH:

<br />

### /path/to/bin

パソコンに教えてあげたいファイルまでの場所です。
今私がいる場所が `/usr/local` なので、
``` `pwd`/path/to/bin``` と書くのと、
`/usr/local/path/to/bin` と書くのは 同じです

- ~~\`pwd\`~~ 👍OK
- ~~/path/to/bin~~ 👍OK
- $PATH: 👈次

<br>

### $PATH:

`$PATH` とは、あらかじめ作っておいた `PATH` のことです

```
$ export PATH=AAA
$ export PATH=$PATH:BBB
```
例えばこう書くと、

<br>

```
$ export PATH=AAA:BBB
```
こう書いたのと同じ意味になります

<br>

今までパソコンに教えてあげた `PATH` を消してしまわないように、古い`PATH`の後ろに付け足すように命令してます

- ~~\`pwd\`~~ 👍OK
- ~~/path/to/bin~~ 👍OK
- ~~$PATH:~~ 👍OK

# まとめ

さいごに改めてコマンド全体をみてみます

``` ターミナル.sh
echo 'export PATH=$PATH:`pwd`/path/to/bin' >> ~/.zshrc
```

この一行を無理やり日本語に直すと

```
パソコン君、今私がいる場所を基準に考えてね！ (pwd)
/path/to/bin というファイルを覚えておいてね！ (/path/to/bin)
今まで教えた他の場所も忘れないでね！ ($PATH)
ターミナルを開くたびに毎回これを言うの面倒だから次からは自動的にやってね！ (export X >> ~/.zshrc)
```

というコマンドなのでした。🥳

# さいごに

うーん改めてまとめるとやっぱり難しい。必要な知識が多すぎる😂
長々と説明しましたが、結局のところ初心者にとっては "おまじない" で良いのだと思います。


<br>

少しでも知識習得の助けになっていれば幸いです。
長文を読んでいただきありがとうございました。