【初心者でもOK!】Macのパス($PATH)を理解する
前回 環境変数の記事 でガッツリ環境変数とはなんぞ?というところを書きました。
この記事ではMacの.bash_profile
や.zshrc
に良く記載する 環境変数PATH
について
- 結局
PATH
て何? - 「:」を使うの?
- PATH通したはずなのに前と変わらずうまく実行出来ない
- 場合によってはPATHの書き順を変更する必要があるの?
といった事を紐解いていこうと思います。
そもそも環境変数の事が良く分からん、、という人は前回の記事を読んでいただければと
【初心者でもOK!】$PATHを理解するためのMacの環境変数について
環境変数 PATH の役割
PATHの役割は大きく2つあります。
- コマンドをコマンド名だけで実行出来るようにする
- 同じコマンドが複数インストールされている場合優先して実行するコマンドを決める
これだけだと
(゚д゚)?
てなりますよね、というわけで1つずつ紐解いていきます。
役割1. コマンド名だけで実行出来る
普段皆さんは以下のようにコマンドを実行していませんか?
1 2 3 4 5 |
$ node index.js $ npm run start $ rails s |
仮にPATHの設定をしていない場合毎回こんな風に書かないといけないんです。
1 2 3 4 5 |
$ /usr/local/bin/node index.js $ ~/.nodenv/shims/npm run start $ ~/.rbenv/shims/rails s |
コマンドを使う度にこんな長ったらしく呼び出す必要性があったらキレますねw
このように「コマンド名だけで実行出来るようにする」のがPATHの役割の1つです。
これはコマンドがあるフォルダをPATHに指定する事で、コマンド名のみで実行出来るようになるから。
そして、ターミナルで使用する echo
・ls
・node
・npm
・rails
などこれら全てのコマンドは実行ファイルと呼ばれるものになります。
実行ファイルについて
エンジニアの皆さんが普段使っているコマンド=実行ファイルです。
実行ファイルとは、CUI上での便利ツール・アプリのようなものです。
MacやiPhoneには、電車の時刻を調べるアプリ、動画を編集するツール、、など何かを楽にするようなアプリやツールが沢山あります。
実行ファイルはそれらのターミナル版・CUI版と思ってもらえればOKです!
先程記載したnode
を例に取ると/usr/local/bin/
というフォルダの中にnode
というコマンド(実行ファイル)があり、それを呼び出しています。
このようにコマンドを使うというのはどこかしらのフォルダの中のファイル(実行ファイル)を呼び出しているだけ、に過ぎないんです。
Homebrewを使ってコマンドをインストールしている人は、以下のコマンドでHomebrewを使ってインストールした実行ファイルが確認出来ます。
1 2 3 4 5 6 7 8 9 10 |
# Homebrewでインストールした実行ファイルをターミナル上で一覧表示 $ ls -l /usr/local/bin/ total 3768 lrwxr-xr-x 1 yuu admin 31 May 17 07:28 2to3@ -> ../Cellar/python/3.6.5/bin/2to3 lrwxr-xr-x 1 yuu admin 36 May 17 07:36 2to3-2@ -> ../Cellar/python@2/2.7.15/bin/2to3-2 ・ ・ # Homebrewでインストールした実行ファイルをFinderで一覧表示(Finderが開かれる) $ open /usr/local/bin/ |
役割2. 優先して実行するコマンドを決める
「PATH通したはずなのに前と変わらずうまく実行出来ない...」という経験がある人はぜひこの部分を読んで下さい!
個人的に、プログラム始めた頃に知っておきたかった、という重要な事の1つです。
node
・ruby
・rails
・vim
など、これらの実行ファイルは1つのMacに複数入れられます!
てかエンジニアリングやっている人であれば、ほとんどの人が何かしらのコマンドは複数入っているはず!
そして、
複数存在するコマンドはPATH
を使って優先度を決め、複数あるうちの1つをデフォルトとして使用しています。
普通にみんな知ってる事なんですかね??
僕はプログラム始めて4年ぐらい経ってからようやく理解出来たところです...^^;
ruby
というコマンドを例に挙げて書きます。
Rubyを触っているエンジニアの人だと以下3つのフォルダにruby
というコマンド(実行ファイル)が入っている可能性が高いです。
フォルダ | 詳細 | 特徴 |
---|---|---|
/usr/bin/ | Mac標準で付属しているコマンド群があるフォルダ | 初期状態から使用可能 |
/usr/local/bin/ | Homebrew でインストールしたコマンドがあるフォルダ |
brewコマンドで簡単に最新のrubyを使えるように出来る |
~/.rbenv/shims/ | rbenv でインストールしたコマンドがあるフォルダ |
プロジェクト毎にrubyのバージョンを切り替えられる |
実際にそれぞれのフォルダにruby
コマンドが存在するかは以下のようなコマンドで確認可能です
1 2 3 4 |
# /usr/bin/ の部分を調べたいフォルダに変更 #「ruby*」のように表示されればそのフォルダ内にrubyコマンドが存在する $ ls -l /usr/bin/ | grep ruby 705:-r-xr-xr-x 1 root wheel 52016 Mar 28 13:02 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
のように同じコマンドが複数存在してたらどのコマンドを優先して使っているか気になりますよね?
1 2 3 |
$ ruby -v ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17] # => パッと見だとどのrubyを使っているか分からない |
こんな時にどこのコマンドを使っているか which
というコマンドで調べる事が出来ます。
1 2 3 |
$ which ruby /Users/yuu/.rbenv/shims/ruby # => rbenv でインストールしたrubyを優先して使っている事が分かる |
PATHのルール
PATHがどんな役割があるのか?というのが分かったので、最後に環境変数PATHのルールについて見ていきます。
PATHには以下2つのルールがあります
- フォルダの区切り文字に「:」を使う
- 左から順番にフォルダ内のコマンドを読み込む
この2つが分かってしまえばPATHの設定も怖くない!
1. フォルダの区切り文字に「:」を使う
環境変数PATHにはコマンドが格納されたフォルダのパスを指定します。
そうすることでruby -v
・node -v
のようにコマンド名だけで実行出来るからです。
その際に複数のフォルダを指定する場合「:」(コロン)を使用します。
PATHの設定を確認
1 2 |
$ echo $PATH /Users/yuu/.rbenv/shims:/usr/local/bin:/bin:/usr/bin |
少し見づらいので「:」の部分で改行出来るようコマンドでゴニョゴニョします。
1 2 3 4 5 6 7 |
# PATHの:の部分で改行する # : を \n に置換、echo -e にする事で \n を改行と認識 $ echo -e ${"PATH//:/\n"} /Users/yuu/.rbenv/shims /usr/local/bin /bin /usr/bin |
この場合だと以下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
をして左に出てきたフォルダのコマンドが優先して使用されます。
1 2 |
$ echo $PATH /Users/yuu/.rbenv/shims:/usr/local/bin:/bin:/usr/bin |
そのため、ruby
は/Users/yuu/.rbenv/shims/ruby
が使用され、vim
は/usr/local/bin/vim
が使用されます。
そのフォルダ内のコマンドが使用されているかを確認するには先ほどのwhich
を使います。
1 2 3 4 5 |
$ which ruby /Users/yuu/.rbenv/shims/ruby $ which vim /usr/local/bin/vim |
あとがき
途中にちょろっと書きましたが、PATHをきちんと理解するのに4年かかるという・・笑
知らなくてもどうにかなってたけど、ターミナルでコマンドを打って作業をする事が多い人は知っておくと何かと便利です。