🛣️

「PATHを通す」とは何か、改めてまとめてみた

2022/10/16に公開

「PATHが通っている」とはどういう状態か?

「PATHが通っているかどうか」なんて気にしなくても、コマンドラインで実行ファイルのフルパスを指定すれば、コマンドを実行することができる。

$ /usr/bin/git

でも毎回フルパスを入力するのはメンドい。

PATHという名前の、シェルの環境変数に設定が書かれていれば、フルパスを入力せずに、プログラム名だけで実行できる。

$ git

この状態のことを「(gitコマンドに)PATHが通っている」と呼ぶ。

環境変数「PATH」の中身と、使われ方

環境変数「PATH」の中身を確認する

$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin
↑の出力結果を改行したもの
/usr/local/bin:
/usr/local/sbin:
/usr/bin:
/bin:
/usr/sbin:
/sbin:
/opt/homebrew/bin

使われ方

例えばgitというコマンドを入力したとき、

  • /usr/local/bin/gitという実行ファイルがあるか確認し、あれば実行する
  • なかった場合、/usr/local/sbin/gitという実行ファイルがあるか確認し、あれば実行する
  • なかった場合、/usr/bin/gitという実行ファイルがあるか確認し、あれば実行する
  • (環境変数PATHに書かれているディレクトリの数だけくり返す)

という流れで、実行するプログラムが決定される。

実行するプログラムが見つからなかった場合command not found: gitというエラーが出力される。
「環境変数PATHに書かれている場所を探してみたけど、gitなんてプログラムはなかったよ!」
という意味。この状態を「(gitコマンドに)PATHが通っていない」と呼ぶ。

PATHを通す方法

実行ファイルは存在するのにcommand not found: XXXが出てしまうときの対応方法(PATHを通す方法)は、大きく以下の3つがある。

1. XXXXの実行ファイルがあるディレクトリを、環境変数PATHに追記する

homebrewやnodenvを有効化するときなど、特定のディレクトリにいろんなプログラムが配置されるような場合に、この方法をとることが多い。

.zshrcとかに、以下のような記述を追加する。

export PATH=$PATH:<PATHに追加したいディレクトリのpath>
補足
  • export PATH=hogehogeで環境変数PATHの値を変更できる
  • $PATH:xxx = 既存のPATHの内容($PATH) + :xxx
  • シェルで行った環境変数PATHの変更は、そのシェルセッション内でのみ有効で、シェルを閉じるとその変更は失われる
  • .zshrcなどのファイルは、シェルを起動するたびに読み込まれるので、このファイルにPATH追加のためのコマンドを書くことで、データを永続化できる

2. PATHが通っている場所にXXXXの実行ファイルを移動する

すでにPATHが通っている場所に、実行したいプログラムの実行ファイルを移動することで、PATHを通すことができる。

$ mv <既存の実行ファイルのpath> <移動したいpath>

3. PATHが通っている場所にシンボリックリンクを貼る

すでにPATHが通っているディレクトリに、実行ファイルへのシンボリックリンクを貼る方法。
実行ファイルの実体は移動せず、PATHを通すことができる。

$ ln -s <既存の実行ファイルのpath> <作成するシンボリックリンクのpath>

その他

実行ファイルがどこにあるか(そもそも存在するのか)を調べる

findコマンドで探す

# /usr配下、/bin配下、/opt配下からgitを探す場合
$ find /usr /bin /opt -name git

特定のコマンドの実行ファイルの場所を調べる

$ which git # 実際に使われている実行ファイルの場所を出力
/usr/bin/git

$ where ruby # ヒットした全ての実行ファイルの場所を出力
/Users/tsubasanamatame/.rbenv/shims/ruby # 実際に使われている実行ファイルが先頭に出力される
/usr/bin/ruby

参考

https://qiita.com/sta/items/63e1048025d1830d12fd

https://datawokagaku.com/what_is_path/

Discussion