Edited at

なんでPATHを通さないといけないの?

ソフトウェア開発の入門書などを読んでいると、「PATHを通しましょう」と言われますよね。環境変数のあれです。いわゆるおまじないですが、なんでこんなことしなきゃいけないの?



  1. 環境変数のPATHとファイルのパスがややこしいので、ここでは前者をPATH、後者をパスと書きます。

  2. プログラマー向けです。WindowsでIDEとか使ってるとPATHってなじみがないと思うので。

  3. Win/Linux/Mac 大体同じです。少なくとも考え方は同じです。一応パスなどはWindows流で書いてます。



そもそも環境変数とは

「変数=値のリスト」の形式でシステムに値を登録しておく手段です。

例えばMAIL=hoge@example.comとしておけば、cmdでMAILと打てば長たらしいアドレスを打たなくて済むわけです。グローバル変数みたいなもんです。(OS全体で共有されるもの、ユーザー内だけで共有されるもの、そのプロセスだけで共有されるもの等ありますが、今回は気にしません。OSまたはユーザーの設定だと思ってください)

他にも、プログラム中にハードコードできないパスワードや、マシンによって変わるIPアドレスなどを環境変数に逃がして、プログラム中から参照できるようにしたりします。


プログラムの起動の仕方

cmdをはじめ、プログラムを起動するには

現在のディレクトリがc:\hoge\で、その中にhuga.exeがあるなら、

$ huga.exe

と打てばOK。

また、面倒ですが、

$ c:\hoge\huga.exe

カレントディレクトリがc:\piyo\でさっきのhoge.exeを呼びたいなら相対パスで

$ ..\hoge\huga.exe

または絶対パスで

$ c:\hoge\huga.exe

となります。階層が深いと大変です。

これは、OSがプログラム名(コマンド)からプログラムのファイル実体を探しに行く先が、基本的にカレントディレクトリだからです。


PATHの役割

カレントディレクトリにないものは、絶対パスや相対パスで打つことになります。しかし例えばssh(リモート操作のプログラム)なんかは毎回毎回ssh.exeのあるディレクトリに移動するか、c:\Program\Openssh\bin\ssh.exeなんて長たらしく打ってられません。そこでOSに「もうc:\Program\Openssh\bin\はカレントディレクトリじゃなくても探してよ」と伝えましょう。cmdを再起動すれば、sshとだけ打てばよくなります。

この時OSに伝えたいディレクトリがPATH変数の中身です。OSがPATHを見て、「ここと、ここと、ここにsshがあるかもしれないから探そう」としてくれます。

モチロン、自動で探して欲しいディレクトリなんて沢山あるので、PATH変数の中身はセミコロン区切りで複数のパスを入れられるようになっています。

因みに.exeも省略できるようになってます。


いいや、俺は絶対パス打つからいいよ!

ダメです。

cmdで実行するときはそれでもいいかもしれませんが、他のプログラムの中でそれを呼び出したい場合があります。例えばgitの中ではsshを呼び出します。gitの開発者はあなたのPCの中のssh.exeの場所なんて知る由もありませんから、PATHに自分で登録してね!ということになっているのです。(インストーラがうまいことやってくれたりもしますが…


活用

自分で便利ツールを作ったとしましょう。実行すると「maki」と表示されるyuka.exeです。これは頻繁に使いますね。

ファイルの在りかはc:\hogehoge\piyopiyo\znd\znd\yee\yuka.exe

絶対パスでなんて打ちたくないですね!

環境変数PATHにc:\hogehoge\piyopiyo\znd\znd\yeeを登録、すると

$ yuka

maki

こんな感じです。公開されているプログラムだと大体インストーラが(Linuxならmakeとかyum、apt-get)がやってくれてますが。中では環境変数PATHに登録してくれているので、何も考えずにコマンドが使えるようになっていたのです。

javacもadbもpythonもみんな実体となるexeがどこかにあって、PATHにディレクトリが登録することで、普通のコマンドと同様に使えるようにしてるのです!