入れたはずのPythonがcommand not find
と出力されて使えない…
入っているはずなのにnvmコマンドを打ってもcommand not find
と出力されて使えない…
などなど、入れたはずのツール、言語がチュートリアル通りにターミナルへ入力してもcommand not find
と出力される問題。
こんなことがあった時に偉い人からよくいただくアドバイスが**「どうせパスが通ってないんでしょ?」**
いやいや、パスってなんじゃい!と思って重い腰を上げて調べました。
ちなみに私は使っているmacOSが古く、bashを使ってます。
新しいmacOS(確かCatalina以降?)の人はzshなので、編集するファイルが違ったり、ちょこっと違うみたい(使った事ないからわからない)のでご了承ください。
パスを通すとはコマンドを探す先を教えてあげること
インストールしたツールや言語を使うためには、そこまでのファイルパスを環境変数に設定して、文字通り道を作ってあげないと召喚できない、使えない。
パスはそのコマンドなどの情報が保存されているファイルまでの道のことらしい。
Linuxやmac、多分Winも新しい言語とかツールとかをインストールした時にこのパスを通す作業をしないとそのコマンドが使えないことがあるみたい。
「パスが通ってない」とは
コマンドを入力したのに、command not found(コマンド見つからなかった)と出る状態。
例えば仮にアイウエオがあって、アイウエオとコマンドを打つとする。
そうすると以下になったりする。
$ アイウエオ
-bash: アイウエオ: command not found
そんなコマンド知らないよ。(=そんなんどこにあるの?)となる。
実際にはインストールしたのに!コマンドのファイルがあるのに!って思っても、そこまでのパスが通っていないので、そのファイルがどこにあるのかPCは分からず、見つからない時もこれが出る。
お使い行って、お店がわからなくて、そのまま帰ってきたみたいな感じ。。
いざパスを通す(一時的ver.)
パスを通すとは、具体的には$PATH
という変数に、そのコマンドが入っているファイルへのファイルパスを登録して道を教えてあげることです。
ということで、まずはその$PATH
の中に何が入っているのか、$ echo $PATH
コマンドを入力して見てみましょう。
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
出力された/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
が$PATH
の中身です。
:
までで1区切りとして読み、左側にいくにつれて優先順位が高くなります。
そのため、上記出力例でいくと、以下の様になります。
優先順位ランキング
1位 /usr/local/bin
さん
2位 /usr/bin
さん
3位 /bin
さん
4位 /usr/sbin
さん
5位 /sbin
さん
$PATH
という変数の中身を確認したら、追加したいコマンドのファイルパスをFinderとかを使って予め調べておいて、ターミナルに以下を入力します。
$ export PATH=$PATH:加えたいコマンドのファイルパス
けれども、これだとターミナルを閉じるとまた初期化されて元どおりになってしまい、再度開いてコマンドを入力するとcommand not foundになってしまいます。。
いざパスを通す(永遠にver.)
恒久的にパスを通す、つまりPCを立ち上げ、ターミナルを開いたらいつでも使える状態にしておくためには.bash_profile
や.profile
, .bsh
, .zshrc
みたいなファイルへパスを書いて保存します。
.bash_profile
や.profile
, .bsh
, .zshrc
などはホーム(macだとユーザー名のディレクトリ直下)に入っているみたいなので、今ターミナルで開いている階層がホームではない人は、何も考えずにターミナルウインドウを×ボタンで消して、また立ち上げるか、別にターミナルウインドウを新しく開いてそこでやるとか、cd
とだけターミナルに打ち込むとかして、ホームに移動しましょう。
そこで、以下のls -a
コマンドを入力してどんなドットファイルが入っているのか、確認しましょう。
$ cd
$ ls -a
ls -a
をすると今いる階層(ちゃんとホームにいますよね?)にある、ドットファイルを含めた、そこの階層にあるもの全てが一覧表示されます。
あとはviコマンドでそれらを開いて、編集しましょう。
$ vi 編集するファイル名
viコマンドを打ったら、少し変わった表示になったと思います。
viはターミナル上でそのまま使えるテキストエディタです。なので、実はこの作業は全部ターミナルでやらなくても、ドットファイルを直接VS Codeみたいなエディタで開いて編集するのでもいいです。
今回はあっちこっち移動するのも面倒なので全部ターミナルで終わらせます。ちょっとプロっぽい瞬間です。
viコマンドでファイルを開いただけでは、入力ができないので、I
キーを押してインサートモードにして入力ができる状態にし、先に何か書いてあったら最終行にさっきの追加したいコマンドのファイルパスを入力します。
↓こういつやつを書き込む。
PATH=$PATH:加えたいコマンドのファイルパス
入力が終わったら、Esc
キーでインサートモードを解除し、:
キーと、w
キーと、q
キーを、順番にキー入力して、編集内容を保存してエディタを閉じます。
ここまでくれば、あとはターミナルのウインドウを消して、ターミナルを立ち上げ直せば再起動したことになり、先ほどの編集内容が反映されるはずです。
再起動が面倒であれば以下のコマンドで編集内容を反映させる方法もあります。
$source ~/.bash_profile
「コマンドの情報が入っているファイルの場所を調べるコマンド」でパスが反映されてるか確認
先ほど通したパスが、きちんと通っているか確認します。
そのために、コマンドのパス情報がどこのファイルに入っているのか確認する以下のコマンドを入力してみましょう。
$ which コマンド名
実行例
$ which pyenv
/usr/local/bin/pyenv