箱のプログラミング日記。

えんじにあ奮闘記

「パスを通す」の意味をちゃんと理解する

f:id:y_hakoiri:20191102121618j:plain

「パスを通す」ってよく言うしなんとなく普段言われるがままやってるけど、ちゃんと言語化しておこうと思いLinuxのお勉強。

そもそもの話

そもそも日頃実行しているコマンドたちは、それ自体がどこかにファイルとして存在していて、コマンドを叩くことでファイルの中身のスクリプトが読まれ、その結果実現したい処理が走っている。

$ cat index.html

↑ローカルPCのどこかにあるcatファイルの中に「引数で与えられたファイルをconcatしろ」っていう命令が書かれている。

catコマンドを実行する=catファイルの中身を実行する。

$ rails db:migrate

↑ローカルPCのどこかにあるrailsファイルの中に「引数でdb:migrateが与えられたらこういう風にしろ」っていう命令が書かれている。(以下略)

どこにあるの??

ローカルのどこかにコマンドファイルがあることは分かった。

じゃあcatとかrailsとかってどこにあるの??

$ which cat
/bin/cat

whichコマンド叩けば教えてくれる。

$ which rails
usr/bin/rails

よくbin/railsってやるよね。

$ which which
usr/bin/which

ちなみにwhichコマンドもどこかにwhichファイルがありそれを(略)

ディレクトリ指定しなくて良いの??

railsコマンド実行ファイルが/usr/bin配下にあるのは分かったけど。なんでわざわざusr/bin/railsってやらなくても実行してくれるの??

あらかじめパスが通ってるから

Linuxコマンドについては当然初めからパスが通ってるから何もしなくても大丈夫だけど、後からインストールしたもの(railsとか)はだいたいパスが通ってなかったりする。

そういえば何かをインストールするたびにだいたい「Success!」とともに「どこからでも実行させたいならパス通してね〜」みたいなアナウンスがされる。

そもそも何かをインストールした時には、ローカルのどこかしらに実行ファイルがごっそり作られる。例えばrailsをインストールしたらrailsにかかるコマンドを実行できるように、命令ファイルやそれを束ねるディレクトリが作られる。

railsコマンドを打った時にその複雑なディレクトリまで指定しなくてもファイルの居場所を探して実行してくれるのが、「パスを通す」の恩恵。

パスが通ってるかどうかを見たい

$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/bin:/sbin

自分のローカルに設定されているパスは$PATHで確認。(本当はもっとあるけど)

コロン(:)で区切られて、左から順番に探しに行ってくれる。

例えばrailsコマンドを実行したらまず/usr/local/binの中にrailsがあるか探しにいき、なかったらその次、、、という具合。

ということは、今回実行したいのは/usr/binの中のrailsなのに、何かの間違いでそれよりもサーチの優先順位が高い/usr/local/binの中にスクリプトの中身が違うrailsファイルが存在したら、railsコマンドが実行された時にそっちを読んでしまい、結果何かしらコマンドエラーが起こるということ。

なんか以前こういうのでハマった気がしたな。。

参考

新しいLinuxの教科書