Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2914

「PATHを通す」について

$
0
0

人に説明する機会があり
再度、自分なりに解釈し直してみようかと。

対象

・Linux触りたての初心者の方
・プログラミング言語を触ったことがある
・絶対パス、相対パスについて理解している

まずはおさらい

PATHを通すとは?

こういうの↓

$ export PATH="$HOME/.rbenv/bin:$PATH"
PATHとは?

環境変数の一つ。

と言われても…最初は自分も理解できませんでした。

まず抑えておきたいポイント

・コマンドとは?
・PATHとは?

コマンドとは?

$ mkdir directory_name

これは解釈し直すと、directory_nameという引数をもらって
mkdirという関数が引数の名前のディレクトリを作ってると言い換えられます。
自分はコマンドは関数だと仮定すると、色んなことが理解しやすくなりました。

関数とはある値を受け取って、違う値を返すものだと思ってもらったらいいです。
※ある値は空の場合(void)もあり得ます。

例えば関数doubleが引数aを受け取ると、a*aを返すとすると、
double(2)=>4が返ってくるようなイメージです。
どんなものを返すかは、もちろん関数の中身によります。

では、mkdirという関数はどこにあるのか?

$ which mkdir
/bin/mkdir

/bin/にあるようなので、中を覗いてみると…

$ ls /bin/
[         cat       cp        dash      dd        echo      expr      kill      launchctl ln        mkdir     pax       pwd       rmdir     sleep     sync      test      wait4path
bash      chmod     csh       date      df        ed        hostname  ksh       link      ls        mv        ps        rm        sh        stty      tcsh      unlink    zsh

見たことあるコマンドがありますね。ここにコマンド(関数)があります。

実は先ほど例に出した「 $ mkdir directory_name 」は
コンピュータ側には以下のように認識されてます。

$ /bin/mkdir directory_name

つまり関数のパス(住所)をつけないと本当はコンピュータは理解できない。
この前提をまずは理解してください。じゃあどうやっているか?

そこで登場するのがPATHです。

PATHとは?

一言で言うと、コマンド(関数)のパス(住所)が乗ったタウンページのようなものです。

PATHとは環境変数の一つと言いましたが、まずは環境変数の説明から。

大文字で表します。そして環境変数は簡単にいうと、自分が使う変数ではなくて、
コマンドを打った時にコンピュータ側が使う変数だと思ってもらったらいいです。

例えばHOMEという環境変数は、
loginした時に最初にいるべき場所を変数として持っています。

PATHという環境変数は、コマンドを打った時に
そのコマンド(関数)のパス(住所)を変数として持っています。

まとめると、コンピュータがPATHを参照してコマンド実行するまでの流れは

$ mkdir directory_name
 => コマンドが打たれるとコンピューターは自動でPATHを参照
    => PATHに登録されている何冊ものタウンページの中からmkdirを探す
       => /bin/の中に発見。mkdir(関数)を実行。

逆に分かりにくいでしょうか…笑
自分はこういう理解をしています。

言い換えると、コマンドという関数を使うためには、
コンピュータがその関数の場所までたどり着くまでのロードマップがないとダメだと言えます。
プログラミング言語であれば、定義した関数がどこまで使えるかという
「スコープ」という概念があるのですが、コンピュータの場合はあえて取りに行く、
そのための変数をPATHとして記憶しておくということですね。

結局『PATHを通す』ってどゆこと?

PATHという変数は、「タウンページみたいなもの」という話をしましたが、
一冊だけじゃありません。種類別、用途別に何冊も登録されています。

変数にいくつもの値を入れるのに、プログラミング言語には配列という概念がありますが、
PATHでは単純に『:』で区切って登録をしています。
コンピュータ側が『:』で区切られた値を一つのタウンページとして勝手に認識してくれます。

一番最初に例に出したものを見てみましょう。

export PATH="$HOME/.rbenv/bin:$PATH"

一応細かく解説すると

export => シェル変数ではなく環境変数を定義する場合、もしくはシェル変数を環境変数に変える場合に使う。

PATH   => PATHという変数を定義するという意味

$HOME  => HOMEという環境変数をコマンドで使うには$を頭につける

"  "   => 『.』というのがメタキャラクタというのになるため、コンピュータ側が勘違いしないようにする。
          『.』はカレントディレクトリという意味のメタ。ただし$は変数の意味のメタとして認識する。

.rbenv => 隠しファイル。.rbenv/binの中にいろいろな引数となるコマンドがある。
          rbenvが入ってる人は cd ~ => ls .rbenv/bin => コマンドが見れるので参考までに。

:      => PATHのいくつかのタウンページは『:』で区切られているので追記している。
          echo $PATH => a:b:c みたいになってるとしたら…
          export PATH="d:$PATH" => echo $PATH => d:a:b:c みたいになる。
      
$PATH  => 環境変数のPATHを呼び出してる。つまりコンピュータ側には変数が展開された値が渡されてる。
      export PATH="d:a:b:c"がコンピュータ側に渡されたということ。

この一連の流れが『PATHを通す』ということになります。

PATHは何冊ものタウンページ。
それぞれのタウンページには沢山のコマンドのパス(住所)が乗っている。
コンピュータはそのパス(住所)を頼りに、目的のコマンド(関数)へ行き、実行してるんだな、
ぐらいに思っていただけたらいいかと思います。


Viewing all articles
Browse latest Browse all 2914

Trending Articles