【初心者でもOK!】$PATHを理解するためのMacの環境変数について

会社でデザイナーさんの相談窓口を担当してた時期がありました。
(デザイナーさんでもコマンドを使ってくれ、という会社だったため)

その時に

  • 他の人は実行出来ても自分のMacだと実行出来ない
  • 言われた通りにやっても特定のコマンドのバージョンが変わらない

という相談を受ける事が多々ありました。

最初のうちは自分が無知過ぎて、使用しているコマンド(例えばnpmnodeなど)のバージョンが違うだけなんじゃ?ぐらいに思っていたんです。
が、慣れてくるとPATHの読み込む順が違ったため、という事が結構あったんです。

そこで、PATHて何だ?そもそも環境変数てなんだ?と思い調べてみる事にしました。

この記事はまず「Macの環境変数について」プログラム初心者の人でも分かるように書きます
(変数自体が分かれば理解出来るかと)

主に以下の内容を記載します

  • 環境変数について
  • 環境変数の使い方・設定の仕方
  • 以下のようなPATHを設定する際の記述を理解する
    • export PATH="$HOME/.rbenv/bin:$PATH"

環境変数とは

環境変数とは、OSが使用出来る変数の事です。

つまりOS全体から参照出来る変数なので、そのMac内の全てのアプリケーションから参照する事が出来る値になります。

そのMac内であればどんなプログラムやターミナル上からでも読み込む事が出来る、超ポピュラーな変数と思ってもらえれば良いかと。

まず、環境変数を確認するprintenvをターミナルで打ってみましょう

見たことある気がする単語からないものまで、様々な文字列がダーッ!と表示されたと思います。

上記の場合COLORFGBGEDITORHOMEのようなワードが全て環境変数と呼ばれるものです。

そしてそれぞれの変数に対して 15;0vim/Users/yuu という値が入っています。

環境変数を使用する

環境変数をターミナルで試したい、シェルで使いたい、という時は環境変数の前に「$」を付ける事で使用する事が出来ます

HOME という環境変数はフォルダのパスが格納されているので、lsを使う事も出来ます
(変数展開されているイメージ)

これを見て「変数」という表現がしっくりきた人もいるのではないでしょうか?

また、シェルで使う時は「$」を付けると書いたように、他の言語では別の書き方をして参照します。

例えばRubyで環境変数HOMEを使う場合以下のように書きます。

Macは標準でRubyを実行出来るので、以下のコマンドをターミナルで入力すると環境変数を表示出来ます

環境変数を設定する

環境変数は自分で好きなように設定する事が出来ます

一時的・永続的に環境変数を設定する場合もexportというコマンドを使います

一時的に環境変数を設定する

ターミナルで export <環境変数名>=<環境変数の値>と入力します

SHOPPING_SITEという環境変数にAmazonを設定しました。
きっとAmazonで良く買い物をするヤツなんでしょう(私です)

環境変数はプロセスと子プロセスにしか反映されないため、

Mac(というかUnix系)ではWindowsとは違い、環境変数は消えるものです。exportで設定した変数も、あくまでそのプロセスと子プロセスにしか反映されません。

MacOS(OSX) - 【mac terminal bash】環境変数がターミナル再起動後に消える(53211)|teratailより引用

source ~/.zshrc のようにzshrcを再読込するだけでは環境変数は消えず、ターミナルを再起動しないとexportで設定した環境変数は消えません

永続的に環境変数を設定する

では永続的に環境変数を設定するにはどうしたら良いかというと、シェルの設定ファイルにexportを使って環境変数を設定します。

使用しているシェルによって記載する設定ファイルが変わります。

シェル 記載する設定ファイル
bash ~/.bash_profile
zsh ~/.zshrc

使用しているシェルの確認は以下のコマンドで出力された結果の末尾で判断が出来ます
(良く考えると SHELL も環境変数なんだとこの記事を書き始めて気付くというw)

ここでは zsh を想定して記載します。

環境変数を設定するため vim ~/.zshrc~/.zshrcの最終行に以下を記載

source ~/.zshrc でzshrcを読み込み直すと、環境変数SHOPPING_SITEが使用出来るようになっています。

設定ファイルと呼ばれる~/.bash_profile~/.zshrcはターミナルを起動する度に読み込まれるため、ターミナルを再起動しても今度はSHOPPING_SITEに値が設定されています。

環境変数に値を再設定(上書き)する

SHOPPING_SITEに値を上書きするにはどうしたら良いか?

これはもう1度同じように~/.zshrc内でexportを使って値を設定すれば出来ます。

再度vim ~/.zshrcで以下のように編集します。

これでsource ~/.zshrc でzshrcを読み込み直すと

上書き完了です。

PATHを理解するために

ここまでで環境変数に値を設定する方法やその環境変数を使用するイメージが掴めてきたかなと思います。

では冒頭で書いた export PATH="$HOME/.rbenv/bin:$PATH" このような書き方を少しずつ紐解いていきます。

設定ファイル内で環境変数の変数展開を試す

設定ファイル内での変数展開を理解するためにSHOPPING_SITEに値を上書きする際に使用した書き方を少し変更してみます。

イメージとしてはPATHの設定をする時に近い感じで記載してみます。

before:

after:

これでechoを実施すると

2回目のexport時に1回目で設定した変数SHOPPING_SITEが展開されているのがわかります。

このようにシェルは「""」(ダブルコーテーション)内で$HOME$SHOPPING_SITEのように記載するとその変数を展開する事が出来ます

注意点として「''」(シングルコーテーションの)だと変数の展開がされません

環境ファイル内のPATHについて紐解く

ここまでの変数が展開されるという事を踏まえ、

~/.zshrcで仮にPATHに対して以下のように記載をすると
仮なので実際に設定しないようにして下さい(色々なコマンドが動かなくなる危険性しかないので)

このようになります。

つまり

export PATH="$HOME/.rbenv/bin:$PATH"は、この記述より上で設定したPATHの前に$HOME/.rbenv/bin:を追加する書き方になります。

長々と書きましたがPATHの本質部分となる、

  • なんで2回目以降の設定をする際に$PATHの前に記載してんの?
  • なんで「:」を使うの?

は次の記事に記載します。

あとがき

環境変数なんてそんな大したもんじゃない、ぐらいの浅い気持ちで過ごしていました。
が、コマンドを実行する上できちんと理解した方がいいんだなとプログラム始めて6年目ぐらいで気付くという。笑

この記事が気に入ったらいいね!
して最新情報をチェックしよう!

スポンサーリンク