Linux

Linux入門 ~「パスを通す」とは~

概要

ある程度プログラミングの経験のあるかたなら、

「パスを通す」という作業をしたことあるのではないでしょうか?

こんなコード

export PATH="$PATH:/opt/local/bin"

今回は、パスを通すというのは一体なんなのか、なにをしているのか、というのを

プログラミング入門者がわかるよう説明します。

結論

結論から入ります。

パスを通すとは

環境変数($PATH)の記述を変えて、コマンド検索パスを追加することです。

この定義を読み解いていきましょう。

環境変数

漢字が連なっていて難しそうですね。

変数というのは、数学なのででてくる「変数x」と全く同義です。

環境変数は、特別な変数で

ローカル環境(ご自身のパソコン)全てで使える変数です。

言葉で説明されてもあまりピントこないと思うので実際に試してみたいと思います。

ご自身のターミナルを開いてください。

環境変数、$TEST、というものを定義してみましょう。

下のコマンドをターミナルで実行してください。なお、コマンドの初めにある"$"は打たないでください。

$ export TEST="This is a test global variable"

注意:"="の前と後にスペースを入れてはいけません。

上記のコマンドは、

環境変数$TESTを"This is a test environment variable"という中身を入れて、定義しています。

export コマンド

export 定義したい環境変数の名前=環境変数の中身

exportコマンドはターミナルで打てるコマンド(Linuxコマンド)で、

環境変数を定義が出来ます。

続いて、果たして、環境変数$TESTが定義されているか確認します。

$ printenv TEST
this is a test environment variable

上記のようになれば成功です。

これはグローバル変数$TESTの中身("this is a test environment variable")を参照しています。

printenv コマンド

printenv 環境変数の名前

printenvコマンド(僕はprint environment variableの略だと信じている)は

環境変数を参照できるコマンドです。

printenv の後に何も(引数を)書かなければローカル環境にある全ての環境変数を表示します。

さて、環境変数を一度作ったところで、

ご自身のローカル環境(パソコン)にはどんな環境変数があるか確かめて見ましょう。

下のコマンドを実行してください。

$ printenv
...
PATH=/Users/naggigoishi/.rbenv/shims:/Users/naggigoishi/.pyenv/bin:/Users/naggigoishi/.phpbrew/php/php-5.6.23/bin:/Users/naggigoishi/.phpbrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/usr/bin/xcodebuild:/usr/local/sbin
...
TEST=this is a test environment variable
...
USER=naggigoishi
...

上記のようにな記述が表示されたでしょうか?
とても読みにくいと思いますが、

環境変数名=中身
のように表示されてます。

その中で

TEST=this is a test environment variable

このような行があるでしょうか。

これは先程、定義した環境変数$TESTですね。

これでも、$TESTが定義されているか確認できました。

この中になんですが、今回のメインの話、

環境変数$PATHも出力されてますね。もちろん、中身は僕の記述と違っていて構いません。

これは後ほど、触れます。その前に、今回定義した$TESTを消してしまいましょう。

以下のコマンドを実行してください。

$ unset TEST
$printenv TEST

unsetコマンド

環境変数を削除するコマンドです。

環境変数$PATH

以上のことで、環境変数とはどういうものかとそれの扱いは基本だけですかわかっていただけたと思います。

先程少し触れたのですが、標準で$PATHという環境変数が定義されてます。

これはどういうものかとうのを説明していきます。

環境変数$PATHでは

コマンド検索パスを保存しています。

コマンド検索パスとは

コマンド検索パスとはshell(ターミナル)がコマンドを検索するためのパスです。

そもそも、先程から、exportやprintenvなどの「コマンド」を打ってきましたが、

これは何をしているのかというと、パソコンにある(実行)ファイルを読み込んでいるだけなんです。

では、shell(ターミナル)はいかにして、そのファイルを見つけ出しているのか、

全てのファイルを探し出すには、

パソコンには普段全く使ってないファイルが五万とありますので、時間がかかりすぎます。

それで役に立つのが「パス」です。(日本語にすると道です。)

shellに実行ファイルがある道を教えてあげているのがパスなのです。

例えば、

printenvコマンドは、/usr/bin/printenv ファイルを参照しています。

なので、

/usr/bin/printenv

とターミナルに打ってあげても同じことなのです。

それが、どうして「/usr/bin」が省略されてもいいのかというと、

それが環境変数$PATHにかかれているからなんです。

$PATH

さて、いよいよですね、

実際に$PATHの中身を見てみましょう。

$ printenv PATH

僕の場合では以下のような出力結果になりました。

/Users/naggigoishi/.rbenv/shims:/Users/naggigoishi/.pyenv/bin:/Users/naggigoishi/.phpbrew/php/php-5.6.23/bin:/Users/naggigoishi/.phpbrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/local/bin:/usr/bin/xcodebuild:/usr/local/sbin

ここでは、パスが:でわけられています。なのでわかりやすく表示すると以下のようになります。

/Users/naggigoishi/.rbenv/shims
/Users/naggigoishi/.pyenv/bin
/Users/naggigoishi/.phpbrew/php/php-5.6.23/bin
/Users/naggigoishi/.phpbrew/bin
/usr/local/bin
/usr/bin
...省略

そうです。こちらの最後の行に

/usr/bin

がありますね。

先程の、/usr/bin/printenvの /usr/bin はここで書かれているがために省略できたのです。

最後に

以上で、パスを通すとはなんなのか理解できたと思います。

なので、例えば

export PATH="$PATH:/opt/local/bin"

上記のようなコードをみても意味がわかると思います。

環境変数$PATHの最後に「:/opt/local/bin」という記述、「/opt/local/bin」というパスを追加しているのですね。

「:」で区切られているので、初めに「:」が必要になります。

つまり、この記述のおかげで、/opt/local/bin以下のコマンドを実行する事ができます。

お疲れ様でした!

これをパスを通すといいます。