🛣️
「PATHを通す」とは何か、改めてまとめてみた
「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つがある。
XXXX
の実行ファイルがあるディレクトリを、環境変数PATH
に追記する
1. homebrewやnodenvを有効化するときなど、特定のディレクトリにいろんなプログラムが配置されるような場合に、この方法をとることが多い。
.zshrc
とかに、以下のような記述を追加する。
export PATH=$PATH:<PATHに追加したいディレクトリのpath>
補足
-
export PATH=hogehoge
で環境変数PATH
の値を変更できる -
$PATH:xxx
= 既存のPATHの内容($PATH
) +:xxx
- シェルで行った環境変数
PATH
の変更は、そのシェルセッション内でのみ有効で、シェルを閉じるとその変更は失われる -
.zshrc
などのファイルは、シェルを起動するたびに読み込まれるので、このファイルにPATH追加のためのコマンドを書くことで、データを永続化できる
XXXX
の実行ファイルを移動する
2. PATHが通っている場所にすでに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
参考
Discussion