PATHを通すとは

MacOSを使っています

最初は訳もわからず、ドキドキしながら使っていたターミナル
わかってるのかわかっていないのか💦
この辺りでちょっと整理してみようと思います😅

command not foundのエラーは「PATH」が通っていないからです

目次
  1. パス
  2. シェル
    1. GUIとCUI
  3. PATHという環境変数
    1. PATHにディレクトリを追加する
  4. シェルの設定ファイル
  5. 「PATHを通す」とは
  6. /usr/local/bin

パス

ファイルやディレクトリの場所

Windowsは階層の区切りを「¥」または「\」で表現

LinuxやMacは階層の区切りを「/」で表現

絶対パス
「/」 ルートディレクトリ(一番上のディレクトリ)から
*Windowsはドライブ(C:など)
相対パス(今いる場所から)
「./hoge/」 「./」はカレントディレクトリ(現在のディレクトリ)から 「hoge/」でも(省略可)
「../hoge/」 は階層を1つ上のディレクトリから 
「../../hoge/」 なら階層を2つ上のディレクトリから 

シェル

コンピュータの中核にはカーネルがあって、カーネルを取り囲むようにシェルが配置されている(ユーザーがシェルに触れずにカーネルにたどり着くことはできない)
カーネルとやり取りするにはシェルが必要

GUIとCUI

Macアプリの一覧画面GUIの例え画像

グラフィカルなシェル(GUI)

ターミナルの画面CUIの画像

コマンドを入力するシェル(CUI)
ターミナルの画面

Macはターミナルがシェルを操作するための入出力の画面だけを提供するソフトウェアです
ここからのシェルはコマンドを使うシェルのことです

シェルには「bash」「zsh」「sh」などさまざまな種類があります

使っているシェルの確認は echo $0

PATHという環境変数

コンピュータは場所を指定しないと今いる場所を探します
だから、コンピュータに命令するときは原則「ファイルの場所とファイル名(コマンド名)」(パス)指定します

コマンド名は、実行するコマンドのファイル名


ただし、コンピュータには「PATH」という環境変数があり、ファイルの場所を指定しなくてもいい場合があります

環境変数はコンピュータの中のプログラムが共通で使える変数のことで、その環境変数の1つに「PATH」があります

「PATH」は実行可能ファイルを探すために使用する変数です(パスを省略できるディレクトリの一覧のようなもの)

「絶対パス名でコマンドを入力(長い)」すると、シェルはそのパス名を使ってコマンドを探します
「コマンド名だけ(短い)」の場合、シェルは「 PATHで指定されたディレクトリの順」にコマンドを探します

PATHにディレクトリを追加する

echo $PATH で現在のPATHで指定されたディレクトリが全て「:」区切りで表示されます

PATHにコマンドのディレクトリを追加すれば、コマンド名だけで実行できるようになります

$ export PATH=$PATH:追加するディレクトリ名(絶対パス)

exportは環境変数を設定するコマンドで
これでPATHに追加できます

ややこしかったポイント
ターミナルを終了すると追加したPATH=$PATH: の設定は初期に戻ります

だから、ターミナル起動時に読み込まれるシェル設定ファイルに
$ export PATH=$PATH:追加するディレクトリ名(絶対パス)を書いて永続的に有効にします

シェルの設定ファイル

詳しいことは分かりませんが 💦
シェルには「bash」「zsh」などの種類の違いがあり
シェル起動時には、ログインシェルかインタラクティブシェルかの違いがあり
シェル起動時に読み込まれる設定ファイルの名前や順番が異なります

ユーザでログインしてターミナルを操作するので
「bash」でログインシェルの場合「.bash_profile」があれば「.bash_profile」を読み込む→「bash_login」→「.profile」→「.bashrc」の順番
「zsh」は「.zshenv」(ここはやめた方がよさそう💧)→「.zprofile」→「.zshrc」→「.zlogin」となるのだと思います

余談MacOS 「Catalina」はデフォルトのシェルが「bash」ではなく「zsh」です
とりあえず「PATHを通す」時は「.bash_profile」ではなく「.zprofile」と覚えていました😅

「PATHを通す」とは

「PATHを通す」は「永続的にPATHを通す」ことと解釈すると

コマンドを実行する時に、絶対パスを全部書くのは大変なのでコマンド名だけで実行するため、
シェル設定ファイル(.bash_profileや.zprofileなど適正なファイル)に$ export PATH=$PATH:追加するディレクトリ名(絶対パス)(PATH 変数にファイルの場所を追加する設定)を書くことです

コマンドの場所の絶対パスは which コマンド名 で確認できます

「.bash_profile」や「.zprofile」の有無はターミナルを立ち上げた画面でls -a で確認できます

viでファイルを編集する
または下記「echoコマンド」で追加できます
「sourceコマンド」で強制的にシェル設定ファイルを読み込ませています(ターミナルを再起動してもよい)

echo "export PATH=$PATH:/追加するディレクトリ(絶対パス)" >> .bash_profile(または.zprofile)
source .bash_profile(または.zprofile)

MacやWindowsのデスクトップ画面でインストール(インストールウィザードに従ってインストール)するときは、こんなことはしなくていいのだけど

ターミナルからインストールした場合、保存場所が「$PATH」にあるディレクトリ以外だとどこからでもコマンドを永続的に使うには「PATHを通して」新しくコマンドを登録するってことになる

めんどくさくなければ、そのままファイルのある場所まで移動してからコマンドを実行してもいいし、絶対パスを指定してもいい

/usr/local/bin

「/usr/local/bin」はPATHに設定されているディレクトリ
「/usr/local/bin」に実行ファイルを保存した場合は「.bash_profile」や「.zprofile」への追記は不要

「/usr/local/bin」はユーザーがパッケージをインストールした場合の実行ファイルを保存する場所で
その他PATHに設定されている「/usr/bin」や「/bin」はシステムの標準のコマンドが置かれる場所になる

余談npxについて
Node.jsをインストールするとnpxというコマンドも同梱されています
npxコマンドをたたくと「ローカルパッケージ(node_modules/.bin)」⇨「環境変数PATH」⇨「npmレジストリ」の順番でコマンドを探します
インストールされていなくても、自動的にnpmレジストリからパッケージを探し、環境を汚さない場所にダウンロードされます(パッケージ名とコマンドが異なる場合は-pオプションでパッケージ名を明示する必要があります@で始まるスコープを使用したパッケージなどは注意)
また、環境変数PATHからコマンドを探すため、Nodeに関係ないコマンドもnpx経由で実行されます