Blank?=False

ゆるゆる仕事したいフリーランスエンジニアの記事

UnixのPATHについて

f:id:stonebeach-dakar:20160711203615p:plain

Unixでなにかアプリケーションをインストールするとき、「パスを通す」ってよく言いますよね。 この「パスを通す」の意味、今までよく知らずに使っていたのでちゃんと調べてみました。

パスとは

Unixにおけるパスは、2種類あります。

  • ファイルパス
  • コマンドサーチパス

ファイルパス

ファイルパスとはそのまま、ファイルパスです。おわり。

あ、コレじゃダメですか

WinでもUnixでも、ファイルシステムと言うものがあって、コレはファイル・ディレクトリの階層構造を実現しているものです。
たとえば、Fooというディレクトリの中にBarというディレクトリがあったとします。

でも、存在するのは知っていても住所を知らなければアクセスできません。
現実もアイドルの家がどこかにあるのは知っていても住所を知らなければ凸できないのと同じです。
なので、それぞれのファイル・ディレクトリには住所が必要なわけですね。この住所の代わりをするのがファイルパスです。
たとえば、先ほどの

Fooというディレクトリの中にBarというディレクト

だったら、Foo/bar/..というのがファイルパスになります。
もっと細かい話?知らん!(普段から使ってるせいでよくわかってなくても使えるものなんですなぁ。)

コマンドサーチパス

今回の題目の「パスを通す」はこのコマンドサーチパスが該当します。
Unixのターミナルには、様々なコマンドがありますよね。cd, echoなどのビルトインコマンド、
そして、vim, rails, gcc等何かしらのパッケージやアプリケーションをインストールすることで使えるコマンド。
後者のパッケージやアプリケーションをインストールすることで使えるコマンドは、実行ファイルを実行することで使えるのですが、 この実行ファイルが存在するディレクトリをターミナルが知らなければ使えません。

知らないものは使えないわけです。

なので、この実行ファイルが存在するディレクトリをターミナルに教えてあげる必要があります。
コレが「パスを通す」ということです。

パスを通すと何が変わるの?

コマンドが使えるようになります

本ブログはRubメインなので、Rubyのバージョン管理ツールのrbenvを例に上げてみると
パスを通さないと、rbenvと言ってもコマンドが見つからないよ!とbashに怒られてしまいます。

$ rbenv
bash: rbenv: command not found...

ちなみに、rbenvは~/.rbenvgit cloneしているので、

$ ~/.rbenv/bin/rbenv
rbenv 1.0.0-21-g9fdce5d
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

フルパスを使えば呼び出せます。

コレだと使いにくいよね。
というわけで、よく紹介されている通りにPATHを通してみます。

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
$ echo 'eval "$(rbenv init -)"' >> ~/.profile
$ exec $SHELL -l


こうすることで、rbenvと打つだけでターミナルがrbenvの実行ファイルを探して起動してくれる様になります。

$ rbenv
rbenv 1.0.0-21-g9fdce5d
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

See `rbenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/rbenv/rbenv#readme

パスの通し方

パスの通し方は、bash_profile, bash_rc等の設定ファイルに直接記述する方法、
rbenvの例のようにechoでprofileに書き出す方法があります。

bashrcbashを開くたびに実行する処理を書くためのものなので、今回のパスを通す用途には適さないため、 bash_profileに追加するのが良いみたいですね。

あっ・・・もしかして・・・とUnix不慣れな頃に作ったbashrcを見なおしてみたらPATHの記述してました( ゚∀゚)・∵. グハッ!!
qiita.com

PATHの通し方ですが、下が基本です。

export PATH=<コマンドサーチパスに含めたいパス>

プログラミングの感覚からすると、

export PATH=xxxx
export PATH=yyyy

とやると、代入されちゃうんじゃ?と思いそうですが、ちゃんとそれぞれがPATHに追加されるようです。

パスを確認するときはecho $PATHとターミナルに入力すれば表示されます。

$echo $PATH
/home/foo/.rbenv/shims:/home/foo/.rbenv/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/foo/.local/bin:/home/sueda/bin:/home/foo/.local/bin:/home/foo/bin

それぞれのパスは:で区切られます。
なので、bash_profileに入力するときにも下のように区切って入力することができます。

export PATH=xxxx:yyyy

参考文献

UNIX入門 - MacWiki
パス(PATH)の確認と設定方法は? - Pocketstudio.jp Linux Wiki