パスを通す意味とやり方を丁寧に解説[Mac]

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

パスを通すとは、具体的にはコマンドサーチパス(コマンド検索パス)を環境変数`$PATH`に追加すること、と僕は理解しています。

パスを通すことによって、コマンド名のみでコマンドを実行できるようになります。

## コマンド名のみでコマンドを実行するとは？

たとえば、`/bin`ディレクトリの`ls`コマンドを実行するとき、本来はパス名`/bin/ls`を使用する必要があります。

```Terminal
% /bin/ls
```

上記のようにパス名を使用してもコマンドを実行することはできますが、パスが通っていれば、下記のようにコマンド名のみで`ls`コマンドを実行することができるようになります。

```Terminal
% ls
```

## コマンドサーチパスとは?

コマンドがパスの指定なしで実行されると、コンピュータはそのコマンドに対応するファイルを環境変数`$PATH`に定義したディレクトリ内から検索します。コマンドサーチパスとは、つまり実行されたコマンドに対応するファイルを探しにいくディレクトリのパスのことで、環境変数`$PATH`に定義されています。

環境変数`$PATH`は、次のように確認することができます。

```Terminal
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

このように、コマンドサーチパスは`コロン(:)`で区切られています。整理すると次のようになります。

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

これらのディレクトリに格納されているコマンドは、パスが通っているので、コマンド名のみで実行することができます。逆にいえば、ここにないディレクトリに格納されているコマンドは、PATHが通っていないので、パス名を指定しなければ実行することができない、ということになります。

ききほど実行した`ls`コマンドのコマンドサーチパスである`/bin`も、環境変数`$PATH`に定義されていることがここで確認できます。

# パスを通す方法

パスを通すというのは、具体的には環境変数`$PATH`を編集して、コマンドを格納するディレクトリを追記する処理を意味します。

環境変数を設定する際には、`export`コマンドを実行するようです。下記のようにパスを通す方法がよく紹介されています。

```Terminal
% export PATH=$PATH:追記したいコマンドサーチパス
```

たとえば、`/mybin`ディレクトリをコマンドサーチパスとして登録する場合を考えてみます。

まず、現在登録されているコマンドサーチパスを確認します。

```Terminal
% echo $PATH                                        
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

ここに`/mybin`を追加する場合は、次のようにコマンドを実行します。

```Terminal
% export PATH=$PATH:/mybin
```

`export`コマンドは、環境変数を設定したりするためのコマンドです。

上記のコマンドは、環境変数`$PATH`に[現在の`$PATH` + `:/mybin`]を代入する、という処理をしているようです。

更新された環境変数`$PATH`を確認するために、もう一度`echo $PATH`を実行します。

```Terminal
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/mybin
```

このように、`/mybin`というコマンドサーチパスが追加されることがわかります。

ちなみに、環境変数`$PATH`をもとに戻すときには、次のようにコマンドを実行しました。

```Terminal
% export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

## .bashrcと.bash_profileについて

パスを通すときは、`~/.bashrc`や`~/.bash_profile`にコマンドサーチパスを登録する処理を記述する方法が一般的なようです。

これらのファイルは、どちらも自動的に実行されるファイルで、下記のような違いがあるようです。

* .bash_profile: ログイン時のみ実行されるファイルで、環境変数の設定などに使用される
* .bashrc: 対話モードのbashを起動するときに実行されるファイルで、エイリアスやシェル関数の定義などに使用される

試しに`.bash_profile`を使って`/mybin`のパスを通してみようと思います。

まずは`.bash_profile`ファイルをエディタで開きます。

```Terminal
% vi ~/.bash_profile
```

最終行にパスを通すための処理を追加します。

```.bash_profile
export PATH=$PATH:/mybin
```

最後に、`source`コマンドを実行して、`.bash_profile`ファイルの変更を反映させます。`.bash_profile`はログイン時に実行されるファイルなので、ログインをやり直さずに変更内容を反映させたいときは`source`コマンドが使用されるようです。

```Terminal
% source ~/.bash_profile
```

環境変数`$PATH`が上書きされたことを確認します。

```Terminal
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/mybin
```

これで、`/mybin`ディレクトリのファイルはパス名のみで実行することができるようになりました。

## コマンド検索の優先順位

環境変数`$PATH`には、複数のコマンドサーチパスを登録することができます。

```Terminal
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

僕の環境では上記のように環境変数が定義されていますが、コマンドがパスの指定なしで実行されると、コンピュータは左から順番にコマンド検索を始めるようです。

つまり、次のような順番でコマンドを検索します。

1. /usr/local/bin
2. /usr/bin
3. /bin
4. /usr/sbin
5. /sbin

たとえば、2番目の`/usr/bin`と4番目の`/usr/sbin`に同名のコマンド実行ファイルが存在した場合、実行されるのは`/usr/bin`ディレクトリのコマンド実行ファイルになります。「コマンドは実行されるけれど、意図した挙動ではない」というような場合は、環境変数`$PATH`の中身を確認するとよいかもしれません。

## 実行ファイルの格納場所を調べる

`which`コマンドで、コマンドのパスが通っているかどうかを調べることができます。

```Terminal
% which git
/usr/local/bin/git
```

コマンドのパスを調べるときに使うコマンドには、`which`の他にも`whereis`というものがあるようです。

* which: 環境変数`$PATH`で定義したコマンドサーチパスを検索する
* whereis: `/usr/bin:/bin:/usr/sbin:/sbin`を検索する

上記のような違いがあるようなので、パスが通っているかどうかを知りたいときは`which`コマンドを使ったほうがよさそうです。