パスを通すとは？

# はじめに

こんにちは．
Life is Tech ! Tokai版 Advent Calendar 15日目担当の12期映像メンターのじゃぱおです！

今日は、環境構築においてよくある**「パスを通す」**ということについて噛み砕いてみたいと思います．

いつも、環境構築の解説記事では普段言われた通りやっている人も多いと思いますが、その意味がわかっていることも非常に重要です．今回で「パスを通す」ということについて、プログラミングを始めたばかりの人でもわかりやすいように例を用いながら説明してみました！

# この記事の対象者
- 環境構築でパスを通す時にいつもあまりうまくいかない人
- プログラムがどのように実行されているのかあまりわかっていない人

# “プログラムを実行する”ということ
みなさんはソフトウェアを実行する時には、どのように実行しているでしょうか？

デスクトップのアイコンをダブルクリックしている人もいますね．

スタートメニューから希望のプログラムを実行している人もいます．

さらには自分で書いた `Python` のmain.pyを実行する時には

```
$ python3 main.py
```

と白黒の画面に入力してプログラムを実行している人もいますね．

このように、様々な方法でみなさんはプログラムを実行しています．

しかし、**実はこれら全て、内部ではほとんど同じ実行方法で実行されています**．

# “プログラムを実行する”ということは「どこかにおいてあるファイルにアクセスする」ということ
みなさんが主に使用しているWindowsやMac OXなどのOS（オペレーティングシステム）は基本的に `ファイル` という構成単位で動作しています．ファイルには大きく分けてふたつの種類があります（ http://kj01.kgu.mydns.jp/fujimoto/tips/extension.html ）．

- **`プログラムファイル`** --- `Google Chrome`、`Python`、`Xcode`, etc...
- **`データファイル`** --- Word文章、TeXファイルのほか、XXX.pyやXXX.javaもこれに含まれます（プログラム文を記述したファイルそのものだけではプログラムを実行することはできません、`コンパイル`という作業をして`プログラムファイル`を生成して初めてプログラムと言える物になります）


`プログラムファイル`は、コンピュータ上で動作することのできる手続きを記述している物、`データファイル`はユーザがプログラムファイル中で利用する情報を記録するためのファイルとなります．

難しい話ではありません．

これらの全てファイルは、コンピュータ上の`ファイルシステム`の**いずれかの位置に必ず**格納されていてます．必ずです．

`Windows`の場合には`エクスプローラー`、`Mac OS`の場合には`Finder`というOS（オペレーティングシステム）に備わっている「`ファイル`というものを一覧表示することができるプログラム」を使用すると覗くことができます． 

![windows_chrome_dir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529674/d6af075f-0ff1-10f4-966a-84db7786c302.png)


それらのファイルにアクセスするには、**「家の住所」に相当する`パス`というものを指定してアクセス**します．みなさんの自宅がファイルとすると、その住所を指定すれば目的の家にたどり着けることと同じです．

```
// WindowsでGoogle Chromeのプログラムファイルを指定する例
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

// Mac OSでGoogle Chromeのプログラムファイルを指定する例
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
```

さて、少し話が長くなりましたが、題名を思い出してみてください．

> **“プログラムを実行する”ということは「どこかにおいてあるファイルにアクセスする」ということ**

基本的にプログラムを実行する時には次の流れで実行します．

1. `プログラムファイル`が`ファイルシステム`のどこにあるかを調べる
2. `プログラムファイル`の住所である`パス`を調べる
3. OS（オペレーティングシステム）に教えてあげる

という流れでプログラムを実行することになります．

もしあなたがGoogle Chromeのプログラムを起動したい時、上記に示した“住所”の現地に赴いて、呼び鈴を鳴らす必要があるということです．

実際に住所をOS(オペレーティングシステム)に伝えて、プログラムを実行してみましょう．

自分でプログラムファイルのパスを`Windows`なら`コマンド プロンプト`、`Mac OS`ならば`ターミナル`でそのパスをコピーしてEnterを押してみてください．

**`コマンド プロンプト`や`ターミナル`と呼ばれるものは、起動したい`プログラムファイル`のパスを入力するとそのプログラムを起動するようにOSに依頼する**ことができます．

![Windows_start_chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529674/d84b99b4-e38b-aa7d-df6f-651f265f2678.png)

![MacOS_start_chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529674/5fc3e8d7-f22d-5319-1b53-bb299fb03b17.png)

上記のGoogle Chromeのパスに存在する`プログラムファイル`をOSに実行するように依頼したため、Google Chromeが起動しましたね．（それぞれの保存場所によりますがデフォルトは同じです）

今までデスクトップ上のアイコンをダブルクリックしていた人も、スタートメニューから選択していた人も、実はこのようにして、**`プログラムファイル`の位置をOS（オペレーティングシステム）に教えてあげ**て、希望の`プログラムファイル`を実行していたということになります．

ちなみに、あくまでパスというのは、画像の格納位置をプログラムに教えてあげたり、Wordの[開く]からWordファイルを開くだけに使うのではないということは以上の説明からもお分かりだと思います．

# 毎回、長〜いパスを指定するのが大変だから「パスを通す」
さて、そろそろタイトルの答えにまいりましょう．

先ほどまで示したように、プログラムファイルというのは、あくまでとあるディレクトリに存在していて、プログラムを実行するというのは、そのプログラムファイルにアクセスするということです．

しかし、Google Chromeとか、Pythonとかは頻繁にアクセスしますよね？

毎回の実行ごとに

```
$ /usr/bin/python main.py　    //Macのターミナルの場合
$ C:\Users\username\AppData\Local\Microsoft\WindowsApps\python3.exe main.py    //Windowsのコマンド プロンプトの場合
```
と打つのは大変です．

そこで、**実行したい`プログラムファイル`名（上記コマンドであれば `python`となります）がありそうな箇所を予め登録しておこうというアイデアが「パスを通す」ということ**になります．

住所の例であれば、「住所を全て言わずにマンション名だけを指定した時、そのマンションがありそうな場所を予めメモに記して順番に回ってみよう」ということになるかと思います．「パスを通す」時には、そのメモに対してプログラムがありそうな箇所として`プログラムファイル`が存在しているディレクトリを登録することになります．

# パスを通す実際のやり方（Windows）
Windowsの場合は非常に簡単です．設定から環境変数（いわゆるパスです）がGUIで設定できます．
参考：https://itlogs.net/windows-10-path/

# パスを通す実際のやり方（Mac OSX Catalina以降）
MacはGUIを用いてパスを通すのはデフォルトでは不可能です．

また、厄介なことに多くのMacへの環境構築を解説している記事やインストーラーによって、`プログラムファイル`がありそうな場所としてメモをする先が正確ではなく混乱を生むものがあります．（これは**記事が悪いのではなく、Mac OSの仕様変更**、シェルの種類の変更が理由です）．Macにおいて環境構築を行う場合はなるべく**最新の記事を参照する癖**をつける必要があります．

```
vi ~/.bash_profile
vi ~/.bashrc
echo 'export PATH="$PATH:(プログラムファイルが存在するディレクトリ)"' >> ~/.bash_profile
echo 'export PATH="$PATH:(プログラムファイルが存在するディレクトリ)"' >> ~/.bashrc
```
このようにして **`bash_profile`や`bashrc`に記述を追加しようとしている記事**はCatalina以降のOSXを使用している場合はパスを通したと思っていても、うまくいかない可能性があります．

もし、あなたのターミナルの上部に`zsh`と書かれていて、`bash_profile`と書かれている記事を参照している場合はその`bash_profile`と書かれている部分を`zshrc`に置き換えるとうまくいくかもしれません．

### Macでパスをとおすときのお勧めのやり方
```
$ echo 'export PATH="$PATH:(プログラムファイルが存在するディレクトリ)"' >> ~/.zshrc
$ source ~/.zshrc
```
詳しくは https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def が参考になるでしょう．

# まとめ
さて、「パスに通す」ということの概念を噛み砕いて説明してみましたがいかがだったでしょうか．

よくわからずなんとなくパスを通していた人も多いかもしれませんが、これを理解すると、パスが通せていない時に現れるエラー文の`zsh: Command not found`の意味がわかると思います．

予め記したはずのメモに「`プログラムファイル`がありそうな場所」いわゆる「マンションのありそうな場所」が書いていなければ、見つけるよう指示されたマンションを膨大なファイルの中から探さなくてはいけなくなるということです．あなたが郵便配達員だったとしたら探すの諦めちゃうでしょ？「そんなマンション探すの無理だ〜」って言わなければいけません．
コンピュータも見つからないものは見つからないと教えてくれているわけです．

**エラー文は、無理難題を押し付けられてしまったコンピュータによるひそかな叫びです．**

どうぞ、お手柔らかに、エラー箇所を直してあげてくださいませ．