「パスを通す」ってよく言うしなんとなく普段言われるがままやってるけど、ちゃんと言語化しておこうと思い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コマンドが実行された時にそっちを読んでしまい、結果何かしらコマンドエラーが起こるということ。
なんか以前こういうのでハマった気がしたな。。