パスを通すとは? | 超初心者のプログラミングの勉強 MAC

2020-01-28

Pythonを勉強するために、ローカル環境を構築する際に出てきた用語「パスを通す」。

当たり前のように「パスを通す」と言われていてなんのことか全く理解できなかったのですが、理解を深めたいと思います。

途中からメモのようになってしまい情報がうまくまとまりきれていませんが、一通り情報を盛り込みました。

※環境はMacです

パスを通すとは

パスを通すとはパスを指定せずに、コマンドを簡単に呼び出せるようにすることと思えばよさそうです。

例えば私のMacではすでにpyenvをインストールしており、「 /Users/nakamoto/.pyenv/shims 」というパスが通っています。
パスをたどってshimsフォルダの中にいくと謎のデータたちが入っています。おそらくコマンドのデータたちです。

shimsフォルダーの中

これによりpyenvのコマンドがターミナルで直接叩けるようになりました。

例えばshimsのフォルダ内にpythonというデータがいます。そのpythonをターミナル上で簡単に呼び出せるようになっているのです。

以下はpythonコマンドを使ってtest.pyを起動する例です。

$ python test.py

パスが通っていない場合にこのコマンドを実行しようとした場合以下のようになります。

$ /Users/nakamoto/.pyenv/shims/python test.py

パスが通っていないと、いちいちパスを指定してコマンドを実行しなければなりません。
逆をいえば、パスが通ったことによりpythonというコマンドが簡単に使えるようになったことがわかると思います。

動きを確認してみる

説明が下手なので、なんだかよくわからないなという場合、ターミナル内にはすでに/binというパスが通っています。

まず以下のコマンドを実行します。現在日時が表示されると思います。
※ターミナルの$マークの横にdateと打ちます。($はターミナルの開始点の目印として載せています、そそのままコピペする場合$マークは除いてコピーしてください)

$ date

ではパスも含めて書いてみます。

$ /bin/date

同じように実行されるのがわかると思います。

ちなみに上記コマンドが実行できない場合、以下を実行してみてください。

$ cd ~
$ ls -al

よくわからないけれど文字列が表示されれば、動くはずなので何か間違っています。

なにも表示されなければ、さらに以下を実行しターミナルを再起動するとうまくいくかもしれません。

$ cd ~
$ touch .bash_profile
$ touch .bashrc

再起動後はまた以下を実行してみてください。

$ cd ~
$ ls -al

※ .bash_profileはターミナルの設定のようなもので、起動時に読み込まれるそうです。上記コマンドは.bash_profileを作成しています。
いろいろやってたら何もできなくなって上記のコマンドで復活しました。
上記でうまくいかない場合設定などする必要があるかもしれないようなので.bash_profileなどでググってみてください。

パスを確認する

いったいどのパスが通っているのか気になってきたと思います。
通っているパスを確認するには以下のコマンドを実行します。

$ echo $PATH

または

$ printenv PATH

すると以下のような結果が返ってくると思います。

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

※いろいろありますね。個人的に覚えやすいので 「echo $PATH」を使っています。

左から順に読み込みが行われます。例えば同じ名前の「date」コマンドが存在した場合、先に読み込まれた方のコマンドが実行されます。

他にも以下もあります。

$ printf "%s\n" "$PATH"

見方

返ってきた通っているパスの見方についての説明です。

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

一見わかりづらいですが、ルールがわかると簡単です。
コロン「 : 」区切りでパスを読みます。
以下のようにするとわかりやすいとおもいます。

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

上記例の場合5つパスが通っていることがわかります。

これからパスを通そうという時には一度確認してみて、すでに通したいパスのディレクトリが存在すれば追加はする必要はないということがわかります。

パスを通すには

パスを通すにはどうすればいいのかといえば以下のようなコマンドを打てば追加することができます。

$ export PATH=$PATH:追加したいパス

例えば 「 /usr/path/test 」というパスを通したい場合以下のようになります。

$ export PATH=$PATH:/usr/path/test

※ 見やすいように半角スペースを空けようとしたのですが「export」の後の半角スペース以降は空けるとerrorとなりました。

※$PATHはechoではかれた内容が入っています。
例 : $PATH = /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
先に読み込んで欲しいパスの場合、以下のように書くこともできます。
$ export PATH=追加したいパス:$PATH

永久的にパスを保存

上記の方法では一時的にパスを通しているだけでターミナルを終了したり、ログアウトすると消えてしまいます。

そのため毎回使いたいコマンドなどは、保存先のホームディレクトリにある「.bash_profile」にコードを追加する必要があります。

テキストエディットから追加するもよし、以下のコードをターミナルで打ってターミナル上で編集することも可能です。

$ vi ~/.bash_profile

編集した後は以下の方法でVi を終了します。

  1. エスケープキー[esc]を押す
  2. パスを追加
    export PATH=$PATH:追加したいバス
  3. :wq と記述しエンター(保存して終了)
    保存したくない場合は :q!

追加したあとは以下のおまじないを実行。設定を反映させます。またはターミナル再起動。

$ source $HOME/.bash_profile

※$HOMEは「~」でも可能。どちらもホームディレクトリを表す
例:source ~/.bash_profile

※~/.bashrcにパスを保存することもある

これをしないとターミナル再起動時にパスが消えてしまいます。

複数パスを通す方法

一度に一つしかパスを通せないということもなくコロン区切りで複数追加することも可能です。

export PATH=$PATH:追加したいパス1:追加したいパス2

例えば「/test1」と「/test2」を追加したい時。

export PATH=$PATH:/test1:/test2

パスを消すには (順番の変更)

実験がてらいろいろパスを追加してみたはいいけれど、なんかいやだから消して元どおりにしたいという方もいるかと思います。

追加したパスを消すにはどうしたらいいのでしょうか。保存先(~/.bash_profile)の中を開いて強制的にパスを消し去ります。

上記の vi ~/.bash_profile からでも操作可能ですが、個人的に操作が慣れないので他の方法。

sudo nano ~/.bash_profile

/binなどの保存先は以下。いじらないほうが良さそうですが参考までに。

sudo pico /etc/paths

読み込む順番を変える必要があるときなども同じ方法で編集します。

操作的に少し怖いのでパスを通したあとは、きちんと正しいか確認したほうが良さそうですね。もしくはパスが保存されているファイルのバックアップをとってから行ったほうがいいかもしれないですね。

個人的にはまだターミナル操作に慣れていないので、.bash_profileなどテキストエディタで編集したほうが安心です。

終わりに

パスを通すというとなんだか難しいのですが、英語では add path (パスを追加する)や set path (パスを置く)と言われています。なんだかそっちの方がわかりやすい気がするのは自分だけなのでしょうか。

「パスを通す」ははじは未知のものでしたが、かなり理解を深めることができました。まだよくわかっていない部分もありますが参考になれば幸いです。

参考サイト:http://osxdaily.com/2014/08/14/add-new-path-to-path-command-line/
参考サイト:https://stackoverflow.com/questions/15872666/how-to-remove-entry-from-path-on-mac