【UNIX】PATHを通すとは何なのか?【Mac】

対象
プログラミング初心者・記事などで「PATHを通す」と書いてあると混乱する人。Macの人

書いている人 書いてる時点でプログラミング11ヶ月の人。

前提 絶対パスや相対パスを知っている。ターミナルやコマンドラインで操作したことがある。シェルを知っている。

環境  Mac(M1チップ) シェル:zsh

プログラミングをやってると必ずどっかで「PATHを通す」という言葉に出くわすと思う。初心者にとってはターミナルの操作をしていくので難解だし、毎度毎度、「PATHを通す」って何だよって思っていたので自分用にまとめます。

目次

結論

まず、結論を一言でまとめる。PATHを通すとは「環境変数$PATH」に「パス」を突っ込むこと。と自分はこう解釈している。
プログラミングをしているとよくわからない単語ばかりでてくる。その単語の意味を丸ごと覚えようと思っても、またわからない単語が出てきてしまったりしてそのうちプログラミング自体挫折してしまう。解釈は人それぞれなので自分の落とし所を見つけられることが大事だと思う。

ちょっと脇道にそれてしまった。これだけだと意味がわからないと思うので下をそのまま読んで欲しい。

環境変数PATHとは?

そもそも「PATHを通す」で使う「PATH」自体の意味だが、この場合のPATHは環境変数$PATHのことで、いわゆる「パス」とは意味が違う。ややこしいけど、全て大文字の「PATH」とカタカナの「パス」で言葉を使い分けていく。

カタカナのパスは「あるフォルダまでの道のりを表したもの」と自分は解釈している。プログラミングは勉強していなくても、HTMLやCSSを勉強する段階で絶対パスと参照パス必ず通るはず。(/Desktop/practice/index.htmlみたいなやつ。もし知らなければまずはそこからググって勉強しよう。)

環境変数$PATHは、パスが入っている入れ物の名前だ。
変数はプログラミングをちょっとかじってれば、わかると思うけど「箱」のことで、この箱の中に色々突っ込んでいく。例えばPHPだと、$ramen = "二郎" と突っ込んで、echo $ramen とすれば二郎が出力される。どのプログラミング言語でも変数の意味自体はただの箱だと思って良い。そこに何かを突っ込んでくわけだ。

$PATHも変数でこの箱の中には何がはいっているかというと、"パス"が入ってる。ターミナルを開いてecho $PATHと打ってみて欲しい。そうすると、$PATHの中身が表示される。

ターミナルを開いて、echo $PATHと打つ。
そうすると、ずらっとパスが出てきたと思う。$PATHにどれだけパスが入っているかは人によって違う。

$PATHの中身がずらっと出てきて混乱すると思うが、要はここにこれだけのパスが保存されていることになる。ちなみにどこで区切るかというとの部分だ。/usr/local/bin:/usr/bin となっていたら、/usr/local/bin/usr/binで分けられている。実際にこのフォルダをファインダーから見てみよう。/に移動しよう。(ファインダーでcommand+shift+Gで任意のフォルダに移動できる。)

「/」と入力して一番上のフォルダに移動。
usrフォルダの下にはbinとlocalフォルダがあって、localフォルダにはbinフォルダが入っている。

/に移動してもらって確認できただろうか?ちなみにMacの隠しフォルダはcommand+shift+ .で表示できる。

つまりここまでまとめると、「$PATHにはたくさんのパスが入っている。」ということがわかった。

PATHを通すと何が良いの?

これでPATHにはたくさんのパスが入っていることはわかったが、一体ここにパスを追加すると何が良いのだろうか?

結論から言うとPATHを通すことで、どこのフォルダからでも実行したいファイルを呼ぶことができるということだ。

例えば、ターミナルで試しにramenと打ってみて欲しい。たぶん、command not foundとなってそんなコマンドないよと言われてしまうだろう。

ramenと打ってみたら、そんなコマンドはないよと言われた。

なぜなら、このramenコマンドは$PATHに登録されていないからだ。

もちろん、この段階ではまだ意味がわからないと思うが、理解していくためにramenコマンドと入力されたら、I Love ramen!と出力されるようにramenファイルの作成からPATHの追加までをやっていく。
つまりramenコマンドが打たれた時に、ramenファイルが呼び出されてその中身が実行されてI Love ramen!という風にしたいってこと。

ここからファイルを作成していく操作はまた別の知識が必要なので、今はこんな感じでファイルが作れるのね、ふ〜んくらいでみて欲しい。

コマンドが入力されたら、実行するファイルを作成する

①viでramenファイルを作成。

viはターミナル上のエディタ(メモ帳みたいなもん)で、vi ファイル名と書けば、新しくファイルを作成できる。適当なフォルダでvi ramenとしてみよう。

WebPracticeというフォルダでramenファイルを作成

②ramenファイルに記述

この最初の行は正直自分もよくわかっていないので、詳しくは調べて欲しい。このramenファイルが実行された時の処理を書く感じだ。#!/bin/zshのzsh部分は自分が使ってるシェルによって変更するっぽい。

viをInsertモードにして、このファイルが実行されたら'I love ramen!'と出力されるように記述。

catコマンドで中身を確認

ramenファイルができたら、一応catコマンドを使って中身を確認しておこう。cat ramen とすれば中身を確認できる。

catコマンドでramenファイルの中身を確認。どうやら、大丈夫そうだ。

ramenファイルに実行権限を付与してあげる。

ファイルは作成できたが、このままだと実行権限がないので権限を付与してあげる。ここらへんはそのうち勉強すればおk。ls -lコマンドでそのファイルの権限を確認できる。最初は権限が与えられていないが、chmod u+x ramenコマンドで実行権限を与えてあげる。そうするとファイルを実行できるようになる。

ls -lコマンドで確認。この部分をxにしたい。
こう打ってあげて、再度ls -lコマンドで確認すると、、
そうすると、「x」と表示されて権限が与えられた。

ramenファイルを実行する。

権限を与えたのであとはこのファイルの実行だけだ。まずは、ramenコマンドと打ってみよう。以下のように表示されるはずだ。
そう、普通にramenと打つだけではcommand not found: ramenでそんなコマンドないよと言われてしまうのだ。

ramenと打っても表示されない。

では、次に./ramenと打ってみて欲しい。そうすると、「I love ramen!」と表示されるはずだ。

./ramenと打てば、、
うまく出力された!

いったいなぜ./をつけるだけで表示できたのだろうか。順番に見ていこう。

まず、./の意味だがこれは自分がいる現在のフォルダを示してる。(この場合はWebPracticeフォルダ)つまり、この場合「今いるフォルダのramenというファイルを開いて」という命令だから起動ができた。もちろん、ramenファイルがないフォルダに移動してからこのコマンドを打ってもうまくいかない。あくまでramenファイルがあるフォルダに移動してこのコマンドを打つ必要がある。

PATHを通す

ではここから、「どこのフォルダからでもramenファイルを起動したい」とする。ここで$PATHが関係してくることになる。PATHを通すことで、どのフォルダからでもramenファイルを起動することができるようになるのだ。以下の順でPATHを通していこう。

①ramenファイルがあるパスを$PATHに格納していこう。
export PATH=パス名:$PATHコマンドを入力する。パス名のところには起動させたいファイルがあるパスを指定しよう。(この場合はWebPracticeフォルダ)pwdコマンドで自分がいるフォルダのパスが返されるのでそれをパス名にいれよう。

echo $PATHでちゃんとパスが入っているか確認する。
①を行うと、$PATHにパス名が入るはずだ。echo $PATHで指定したパスが表示されるか確認しよう。

echo $PATHでちゃんとパス名が追加されていた。

ramenコマンドを、好きなフォルダで入力しよう。
PATHを通すことができたので、これでどのフォルダからでもramenコマンドを実行できるはずだ。試しにデスクトップに移動してみてramenと打ってみよう。ちゃんと出力されるはずだ。

デスクトップでramenと打っても、しっかり出力された!

$PATHにパスを加えていること、これがいわゆる「PATHを通す」ということだ。デスクトップ意外にも試しに違うフォルダに移動してramenコマンドを打ってみよう。再度成功するはずだ。これでパスを通すメリットがわかっただろうか、どこのフォルダからでもそのファイルが実行されているということだ。

しかし、一体なぜ、どこのフォルダからコマンドを入力してもramenファイルが実行できるようになったのだろうか?

分かってしまえば簡単なことだが、ターミナルで何かしらのコマンドが打たれた時、まず、$PATHの中身を確認していき、そこのパス以下に該当のファイルがあればそれを実行するというのが一連のプロセスになる。

コマンド入力→$PATHに登録されているパスを上から順に確認していきそこのパス以下に該当のファイルがあれば実行される。
なければcommand not foundが返されるというわけだ。

「PATHを通す」コマンドを細かく見る

では今度はPATHを通したコマンドexport PATH=パス名:$PATHを切り分けて見ていこう。

左辺のexport PATHは環境変数を設定するコマンドで、この場合「PATHという環境変数を設定してください」という命令になる。環境変数はPCが用意した変数のことで、この場合$PATHのことだと思って良い。

右辺のパス名には、実行させたいファイルがあるパスを書く。(この場合はramenファイルがある、WebPracticeフォルダだ)パス名に続けて:$PATHとなっている部分は、これまでの環境変数$PATHの中身を展開しているだけだ。

だからパス名と$PATHの前後を変更してexport PATH=$PATH:パス名としてもオッケーだ。前か後ろにパスを付け足すかの違いだけである。

前につける場合(export PATH=パス名:$PATH)
後ろにつける場合(export PATH=$PATH:パス名)

ちなみに、ramenファイルが違うフォルダにそれぞれあったとして、さらにどちらのパスも$PATHに設定していた場合、ramenとコマンドを打つとどちらのファイルが起動するだろうか?答えは$PATHでより上に登録されているパスからだ。上に登録した方から先に処理されることも覚えておくとよい。だから、export PATH=パス名:$PATHとして前に追加した方が基本的には良いと思う。

永続化の設定をする

実は、exportで付け加えた場合ターミナルを終了させてしまうと、せっかく$PATHに設定したパスも消えてしまう。

これを永続的に設定するには以下のファイルを作成して(ない場合)そこに記述していこう。シェルの種類によって読み込まれるファイルや読み込まれる順番っていうのがかわるみたいなのだが、ここらへんは割愛。また違う記事にでもまとめる。
今回自分が使っているシェルはzshなので、homeフォルダ(ログインした時のフォルダ のこと。よく「~」でも表される。)以下に.zshrcファイルを作成する。(シェルがbashの人は.bash_profile.bashrcに記述しよう。なければ作成)そして、export PATH=パス名:$PATHを記述すればOKだ。

自分の.zshrcにはこんな感じでいくつかPATHを永続化している。

書き込んだ後は忘れずsourceコマンドを入力しよう。zshシェルを使用している場合は、source ~/.zshrcでOKだ。

まとめ

以上の流れで「PATHを通す」ということがなんとなく分かったのではないだろうか?ただ単に「$PATHにパスを追加する」っていうだけなんだが、色々説明するとめちゃくちゃ大変だ。本当は.zshrcとか.bash_profileとかももっと調べたかったけど疲れたのでまた別記事でまとめられたらいいなと思う。

あとはこれをどういう時に使うかだが、プログラミングを勉強していればそのうち出くわすことだろう。ちなみに自分は今のとこhomebrewや、composerなどのパッケージ管理ツールでパスを通しておいたり、Flutterの勉強時に通したりくらいだろうか。一度通しておけば、どのフォルダからでも起動できるので便利だよということだ。

この記事が理解できれば、今後パスを通すという指示には立ち向かえるのではないだろうか。みなさんの参考になっていれば嬉しい限りです。勘違いしている部分もあるかもしれないので見つけたら都度修正・変更していきます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次