プログラミングの「パス（PATH）を通す」をちょっと理解した

よくプログラミングの記事を見ると **「パスを通しましょう」** という説明がでてきて、指示通りにするとコマンドが使えるようになる、みたいなことがあるかと思います。

僕がプログラミング始めたてのころは、`$ ホニャララ`の「$」や「%」も一緒にコピペしてしまい、なんかエラーが起きている！！みたいなことがよくありました。

「パスを通す」も、言われたとおりにすればなんだか分からないけど動いてるな〜ってという理解でした。

でも、「パス（PATH）を通す」って意味が分からない😢
- そもそも「パス」って何？
- 「通す」ってどういう意味？
- そもそもなんのために？ ...etc

今ではもう「完全に理解した」ので、昔の自分へ解説するように **プログラミングし始めた初学者の方のために1つずつ仕組みを解説したいと思います** 😊 

⚠️この記事は **Mac** での解説になります。

簡単な自己紹介：
- 名前：ヌギー
- 技術
    - フロントエンドエンジニア（Next.js）
    - バックはRustを勉強中
    - CSSが得意
- SNS
    - [Twitterのアカウント](https://twitter.com/ask_nugey)
    - [ブログ（Ask Nuegy）](https://ask-nugey.com)
    - [Zennのアカウント](https://zenn.dev/ask_nugey)

## 「パス（PATH）を通す」を理解するために必要な知識

この記事を読むにあったって必要な事前知識はこんな感じです↓
- htmlにcssでフォントカラーを変えたことがある
- ターミナルでlsコマンドやcdコマンドを使ったことがある


以下は「パス（PATH）を通す」を理解するために必要な知識ですが、すべてこの記事で解説していきます。

- 「パス（PATH）」の意味
- 「パスを指定する」とはどういう意味か？
- 「ターミナルでコマンドを実行」するって具体的にどういうことか？

## そもそも「パス（PATH）」って何？

パスとは日本語いえば「道」「経路」みたいな意味です。

プログラミングでの「道（道順）」とは、"あるファイルまでに通るフォルダ（ディレクトリ）"のことです。

もう少し具体的に見ていきましょう。
下記はMacでFinderを開いたときの画像です。

![スクリーンショット 2024-03-16 19.03.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/1bd735cf-c593-c567-c1c0-c5eef046056b.png)


このFinderは、「ask-nugey/」というフォルダ（ディレクトリ）を開いて、その中の「page.tsx」というファイルを選択しています。

「ask-nugey/」から「page.tsx」までたどり着くには、以下のようにどんどんフォルダの中に潜る必要があります。

```
ask-nugey フォルダ
↓
src フォルダ
↓
app フォルダ
↓
page.tsx ファイル
```

「ask-nugey フォルダ」から 「page.tsx ファイル」までたどり着くまでの道順（パス）を以下のようになります↓

```bash
/src/app/page.tsx
```

ちなみに、 **道順（パス）は「どこ（スタート）」から「どこ（ゴール）」へまでの2つがわかってないといけません。**

先ほどは、スタート地点を「ask-nugey フォルダ」としていましたが、「src フォルダ」をスタート地点とすると、パスは以下のようになります↓

```bash
/app/page.tsx
```

## じゃあ、「パスを通す」って？？

パスというのは、どのフォルダからどのファイル（もしくはフォルダ）までの道順というはわかりました。

じゃあ、「パスを通す」とはどういう意味でしょうか？

「パスを通す」には「パスを指定する」必要がありますので、まず、「パスを指定する」という意味から見ていきましょう。

### 「パスを"指定"」したことはきっとみんなある

あなたがもしも少しでもhtmlとcssを触ったことがあるなら、実はすでに「パスを"指定"」したことはあると思います。

たとえば、以下のような簡単なhtmlとcssで構成されたサイトがあります↓

![スクリーンショット 2024-03-16 17.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/0533d642-a637-79d0-9439-ca1b0c593cea.png)

このとき、cssを反映させるにlinkタグで以下のようにcssを読み込ませています↓

```html
<link rel="stylesheet" href="/css/style.css" />
```

これは、index.htmlファイル内でstyle.cssまでの「 **パスを指定して** 、読み込ませている」と言えます。

## ターミナルでコマンド（プログラミング）を実行するって結局何してるの？

（ターミナルの説明はこの記事では省きます🙇）

### コマンドを実行するときのファイルがどこにあるか探してみる

たとえば、ターミナルで `ls`コマンドを叩くとファイルなどを表示できます。

コマンドとは「プログラム」と同じ意味です。
lsを実行するためのプログラムが書かれたファイルは、実はパソコンの中に最初から入っています。

では、どこにそのプログラムが書かれたファイルがあるのでしょうか？

実はそんなときに便利なコマンドがあります。
以下は、lsコマンドを実行時にしているファイルのパスを教えてくれるコマンドです↓

```bash
$ where ls
/bin/ls ← lsファイルまでのパス！ここにlsファイルがある！
```

macでは以下のコマンドで 指定したパスをFinderで開いてくれます↓

```bash
$ open /bin
```

※ちなみに`$ open /bin/ls` だと、lsはファイルなのでFinderは開きません

そして、Finderでコマンドが入っているファイルを見ることができます↓

![スクリーンショット 2024-03-16 17.56.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2275224/7b451c78-9cfb-3a1a-88bd-2d5839993881.png)

### 「パスを指定」してコマンドを叩くこともできる

lsコマンドを叩くときは普通 `$ ls`とターミナルで実行しますが、以下のようにlsファイルまでのパスを指定して叩くこともできます↓

```bash
$ /bin/ls
```

### 実はlsといったコマンドはすでに「パスが通っている」

しかし、lsやcdといった標準的なコマンドは **「パスを指定」していなくても直接ファイル名（ls など）だけを書くだけで実行できる設定が最初からされているのです。**

**その設定をすることを「パスを通す」と言います。**

---
補足：
lsなどの標準的なコマンド群がある`/bin`フォルダのパスは、僕のMacでは、`/private/etc/paths`に以下のように設定されていました（パスが通されてます）↓

```
/usr/local/bin
/System/Cryptexes/App/usr/bin
/usr/bin
/bin
/usr/sbin
/sbin
```

たとえば、このファイルの`/bin`の行を削除すると、`ls`コマンドなどは使用できなくなります。
**このファイルをいじるとコマンドが何も書きなくなる可能性があるので、極力触らないようにするのが良い** かと思います。
（補足おわり）

---


「パスを通す」という設定をすることは絶対に必要かと言われれば必要ではありません。

でも、毎回「パスを指定」してプログラム（コマンド）を実行するのは面倒なので、 **最初に「パスを登録（パスを通す）」というわけです。**

繰り返しになりますが、「パスを通す」とは、ターミナルで使用されているシェル（bashとかzsh）に「ls」と打ったら、「/bin/ls」と同じ意味だよと登録していることになります。

その設定の仕方は、MacやWindows、ターミナルでどのシェル（bashとかzsh）などによって微妙に異なっていたります。

もし、あなたのパソコンで `$ git 〜〜` のようにgitコマンドが使用できるているなら、gitのプログラムが書かれたファイルまでのパスが指定されているはずです。

私のパソコンでのgitまでのパス↓
```
$ where git
/opt/homebrew/bin/git
/usr/bin/git
```
※この場合、2つパスが存在している

## 終わりに

この記事を読んだら「パスを通す」という意味はある程度理解できるのかなと思います！
もし、間違いやご不明点があればコメントいただければ幸いです😊

ヌギーのSNS（連絡先）
- [Twitterのアカウント](https://twitter.com/ask_nugey)
- [ブログ（Ask Nuegy）](https://ask-nugey.com)
- [Zennのアカウント](https://zenn.dev/ask_nugey)