PATHを通すの意味がやっと理解できたかも

MacOSを使っています

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

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

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

パス

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

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

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

シェル

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

GUIとCUI

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

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

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

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

UNIX系(Linuxと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 で確認できます

「echoコマンド」で、作成や追加ができます
「sourceコマンド」で強制的にシェル設定ファイルを読み込ませています(ターミナルを再起動してもよい)
echo 'export PATH=$PATH:/追加するディレクトリ(絶対パス)' >> .bash_profile(または.zprofile)
source .bash_profile(または.zprofile)

GUIでインストール(インストールウィザードに従ってインストール)する場合は、こんなことしなくてもいいのだけど

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

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

/usr/local/bin

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

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