【初心者でもOK!】Macのパス($PATH)を理解する

前回 環境変数の記事 でガッツリ環境変数とはなんぞ?というところを書きました。

この記事ではMacの.bash_profile.zshrcに良く記載する 環境変数PATH について

  • 結局PATHて何?
  • 「:」を使うの?
  • PATH通したはずなのに前と変わらずうまく実行出来ない
  • 場合によってはPATHの書き順を変更する必要があるの?

といった事を紐解いていこうと思います。

そもそも環境変数の事が良く分からん、、という人は前回の記事を読んでいただければと

【初心者でもOK!】$PATHを理解するためのMacの環境変数について

環境変数 PATH の役割

PATHの役割は大きく2つあります。

  1. コマンドをコマンド名だけで実行出来るようにする
  2. 同じコマンドが複数インストールされている場合優先して実行するコマンドを決める

これだけだと

(゚д゚)?

てなりますよね、というわけで1つずつ紐解いていきます。

役割1. コマンド名だけで実行出来る

普段皆さんは以下のようにコマンドを実行していませんか?

仮にPATHの設定をしていない場合毎回こんな風に書かないといけないんです。

コマンドを使う度にこんな長ったらしく呼び出す必要性があったらキレますねw

このように「コマンド名だけで実行出来るようにする」のがPATHの役割の1つです。

これはコマンドがあるフォルダをPATHに指定する事で、コマンド名のみで実行出来るようになるから。

そして、ターミナルで使用する echolsnodenpmrailsなどこれら全てのコマンドは実行ファイルと呼ばれるものになります。

実行ファイルについて

エンジニアの皆さんが普段使っているコマンド=実行ファイルです。

実行ファイルとは、CUI上での便利ツール・アプリのようなものです。
MacやiPhoneには、電車の時刻を調べるアプリ、動画を編集するツール、、など何かを楽にするようなアプリやツールが沢山あります。
実行ファイルはそれらのターミナル版・CUI版と思ってもらえればOKです!

先程記載したnodeを例に取ると/usr/local/bin/というフォルダの中にnodeというコマンド(実行ファイル)があり、それを呼び出しています。


Usr local bin内のnode

このようにコマンドを使うというのはどこかしらのフォルダの中のファイル(実行ファイル)を呼び出しているだけ、に過ぎないんです。

Homebrewを使ってコマンドをインストールしている人は、以下のコマンドでHomebrewを使ってインストールした実行ファイルが確認出来ます。

役割2. 優先して実行するコマンドを決める

「PATH通したはずなのに前と変わらずうまく実行出来ない...」という経験がある人はぜひこの部分を読んで下さい!

個人的に、プログラム始めた頃に知っておきたかった、という重要な事の1つです。

noderubyrailsvimなど、これらの実行ファイルは1つのMacに複数入れられます
てかエンジニアリングやっている人であれば、ほとんどの人が何かしらのコマンドは複数入っているはず!

そして、
複数存在するコマンドはPATHを使って優先度を決め、複数あるうちの1つをデフォルトとして使用しています。

同じコマンド複数存在する

普通にみんな知ってる事なんですかね??
僕はプログラム始めて4年ぐらい経ってからようやく理解出来たところです...^^;

rubyというコマンドを例に挙げて書きます。

Rubyを触っているエンジニアの人だと以下3つのフォルダにrubyというコマンド(実行ファイル)が入っている可能性が高いです。

フォルダ 詳細 特徴
/usr/bin/ Mac標準で付属しているコマンド群があるフォルダ 初期状態から使用可能
/usr/local/bin/ Homebrewでインストールしたコマンドがあるフォルダ brewコマンドで簡単に最新のrubyを使えるように出来る
~/.rbenv/shims/ rbenvでインストールしたコマンドがあるフォルダ プロジェクト毎にrubyのバージョンを切り替えられる

実際にそれぞれのフォルダにrubyコマンドが存在するかは以下のようなコマンドで確認可能です

なぜrubyというコマンドが1つのMacに3つも存在するのか?というと

Macには標準でruby/usr/bin/ruby)が入っているけど、標準は何かと使いづらい側面があるから「Homebrew」のruby(/usr/local/bin/ruby)をインストールしよう、でもプロジェクト毎にRubyのバージョンを変更出来た方がいいからrbenv~/.rbenv/shims/ruby)で管理しよう。

と、このような流れから3つ存在したりします。

このように様々なコマンドが1つのMac内に複数存在します。
(もちろん1つだけのコマンドもあります)

複数存在するコマンドのうち「どのコマンドを優先して使うか」を決めるのがPATHの役割の2つ目です。

どこのコマンドを優先して使用しているかを調べる

先ほどのrubyのように同じコマンドが複数存在してたらどのコマンドを優先して使っているか気になりますよね?

こんな時にどこのコマンドを使っているか which というコマンドで調べる事が出来ます

PATHのルール

PATHがどんな役割があるのか?というのが分かったので、最後に環境変数PATHのルールについて見ていきます。

PATHには以下2つのルールがあります

  1. フォルダの区切り文字に「:」を使う
  2. 左から順番にフォルダ内のコマンドを読み込む

この2つが分かってしまえばPATHの設定も怖くない!

1. フォルダの区切り文字に「:」を使う

環境変数PATHにはコマンドが格納されたフォルダのパスを指定します。
そうすることでruby -vnode -vのようにコマンド名だけで実行出来るからです。

その際に複数のフォルダを指定する場合「:」(コロン)を使用します。

PATHの設定を確認

少し見づらいので「:」の部分で改行出来るようコマンドでゴニョゴニョします。

この場合だと以下4つのフォルダ内のコマンドが読み込まれ、コマンド名のみで実行出来るようになります。

  • /Users/yuu/.rbenv/shims
  • /usr/local/bin
  • /bin
  • /usr/bin

2. 左から順番にフォルダ内のコマンドを読み込む

私のMacにはrubyが下記3つのフォルダに存在し、

  • /Users/yuu/.rbenv/shims
  • /usr/local/bin
  • /usr/bin

vimというコマンドは下記2つのフォルダに存在します

  • /usr/local/bin
  • /usr/bin

この場合echo $PATHをして左に出てきたフォルダのコマンドが優先して使用されます

そのため、ruby/Users/yuu/.rbenv/shims/rubyが使用され、vim/usr/local/bin/vimが使用されます。

そのフォルダ内のコマンドが使用されているかを確認するには先ほどのwhichを使います。

まとめると以下のようになります

パスのルール

あとがき

途中にちょろっと書きましたが、PATHをきちんと理解するのに4年かかるという・・笑

知らなくてもどうにかなってたけど、ターミナルでコマンドを打って作業をする事が多い人は知っておくと何かと便利です。

この記事が気に入ったらいいね!
して最新情報をチェックしよう!

スポンサーリンク