【初心者でもOK!】$PATHを理解するためのMacの環境変数について
会社でデザイナーさんの相談窓口を担当してた時期がありました。
(デザイナーさんでもコマンドを使ってくれ、という会社だったため)
その時に
- 他の人は実行出来ても自分のMacだと実行出来ない
- 言われた通りにやっても特定のコマンドのバージョンが変わらない
という相談を受ける事が多々ありました。
最初のうちは自分が無知過ぎて、使用しているコマンド(例えばnpm
やnode
など)のバージョンが違うだけなんじゃ?ぐらいに思っていたんです。
が、慣れてくるとPATH
の読み込む順が違ったため、という事が結構あったんです。
そこで、PATHて何だ?そもそも環境変数てなんだ?と思い調べてみる事にしました。
この記事はまず「Macの環境変数について」プログラム初心者の人でも分かるように書きます。
(変数自体が分かれば理解出来るかと)
主に以下の内容を記載します
- 環境変数について
- 環境変数の使い方・設定の仕方
- 以下のようなPATHを設定する際の記述を理解する
export PATH="$HOME/.rbenv/bin:$PATH"
環境変数とは
環境変数とは、OSが使用出来る変数の事です。
つまりOS全体から参照出来る変数なので、そのMac内の全てのアプリケーションから参照する事が出来る値になります。
そのMac内であればどんなプログラムやターミナル上からでも読み込む事が出来る、超ポピュラーな変数と思ってもらえれば良いかと。
まず、環境変数を確認するprintenv
をターミナルで打ってみましょう
1 2 3 4 5 6 7 8 9 10 11 |
$ printenv COLORFGBG=15;0 COLORTERM=truecolor EDITOR=vim HOME=/Users/yuu LANG=ja_JP.UTF-8 PAGER=less PATH=/Users/yuu/.nodenv/shims:/Users/yuu/.nodenv/bin:/Users/yuu/.pyenv/shims:/Users/yuu/.pyenv/bin:/Users/yuu/.rbenv/shims:/Users/yuu/.rbenv/bin:/Users/yuu/bin:/usr/local/bin:/Users/yuu/.zplug/bin:/bin:/usr/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands ・ ・ _=/usr/bin/printenv |
見たことある気がする単語からないものまで、様々な文字列がダーッ!と表示されたと思います。
上記の場合COLORFGBG
・EDITOR
・HOME
のようなワードが全て環境変数と呼ばれるものです。
そしてそれぞれの変数に対して 15;0
・vim
・/Users/yuu
という値が入っています。
環境変数を使用する
環境変数をターミナルで試したい、シェルで使いたい、という時は環境変数の前に「$」を付ける事で使用する事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 環境変数の確認 $ printenv EDITOR=vim HOME=/Users/yuu PAGER=less ・ ・ # 環境変数EDITORの内容を表示する $ echo $EDITOR vim # 環境変数HOMEの内容を表示する $ echo $HOME /Users/yuu #yuuの部分はユーザ名が入る |
HOME
という環境変数はフォルダのパスが格納されているので、ls
を使う事も出来ます
(変数展開されているイメージ)
1 2 3 4 5 6 7 |
# 変数展開されて $ ls -1 /Users/yuu が実行されているイメージ $ ls -1 $HOME Applications/ Desktop/ Documents/ ・ ・ |
これを見て「変数」という表現がしっくりきた人もいるのではないでしょうか?
また、シェルで使う時は「$」を付けると書いたように、他の言語では別の書き方をして参照します。
例えばRubyで環境変数HOME
を使う場合以下のように書きます。
1 |
ENV['HOME'] |
Macは標準でRubyを実行出来るので、以下のコマンドをターミナルで入力すると環境変数を表示出来ます
1 2 |
$ ruby -e "p ENV['HOME']" "/Users/yuu" |
環境変数を設定する
環境変数は自分で好きなように設定する事が出来ます。
一時的・永続的に環境変数を設定する場合もexport
というコマンドを使います。
一時的に環境変数を設定する
ターミナルで export <環境変数名>=<環境変数の値>
と入力します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 環境変数を設定 $ export SHOPPING_SITE=Amazon # 設定出来た事を確認 $ printenv HOME=/Users/yuu LANG=ja_JP.UTF-8 ・ ・ SHOPPING_SITE=Amazon _=/usr/bin/printenv # 使用してみる $ echo $SHOPPING_SITE Amazon |
SHOPPING_SITE
という環境変数にAmazonを設定しました。
きっとAmazonで良く買い物をするヤツなんでしょう(私です)
環境変数はプロセスと子プロセスにしか反映されないため、
Mac(というかUnix系)ではWindowsとは違い、環境変数は消えるものです。exportで設定した変数も、あくまでそのプロセスと子プロセスにしか反映されません。
MacOS(OSX) - 【mac terminal bash】環境変数がターミナル再起動後に消える(53211)|teratailより引用
source ~/.zshrc
のようにzshrcを再読込するだけでは環境変数は消えず、ターミナルを再起動しないとexport
で設定した環境変数は消えません
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ echo $SHOPPING_SITE Amazon # zshrcを読み込み直す $ source ~/.zshrc # まだ表示される $ echo $SHOPPING_SITE Amazon # ターミナルを再起動する # ターミナルの再起動後は何も表示されなくなる(環境変数がリセットされる) $ echo $SHOPPING_SITE |
永続的に環境変数を設定する
では永続的に環境変数を設定するにはどうしたら良いかというと、シェルの設定ファイルにexport
を使って環境変数を設定します。
使用しているシェルによって記載する設定ファイルが変わります。
シェル | 記載する設定ファイル |
---|---|
bash | ~/.bash_profile |
zsh | ~/.zshrc |
使用しているシェルの確認は以下のコマンドで出力された結果の末尾で判断が出来ます
(良く考えると SHELL
も環境変数なんだとこの記事を書き始めて気付くというw)
1 2 3 |
# 使用しているシェルの確認、下記の場合zsh $ echo $SHELL /usr/local/bin/zsh |
ここでは zsh を想定して記載します。
環境変数を設定するため vim ~/.zshrc
で~/.zshrc
の最終行に以下を記載
1 2 |
# 最終行に追加 export SHOPPING_SITE=Amazon |
source ~/.zshrc
でzshrcを読み込み直すと、環境変数SHOPPING_SITE
が使用出来るようになっています。
1 2 3 4 5 6 |
# sourceでzshrcを読み込み直す $ source ~/.zshrc # 環境変数SHOPPING_SITEが使えるようになる $ echo $SHOPPING_SITE Amazon |
設定ファイルと呼ばれる~/.bash_profile
や~/.zshrc
はターミナルを起動する度に読み込まれるため、ターミナルを再起動しても今度はSHOPPING_SITE
に値が設定されています。
1 2 3 4 5 |
# zshrcに環境変数SHOPPING_SITEを設定後、ターミナルを再起動する # ターミナルを再起動してもリセットされていない $ echo $SHOPPING_SITE Amazon |
環境変数に値を再設定(上書き)する
SHOPPING_SITE
に値を上書きするにはどうしたら良いか?
これはもう1度同じように~/.zshrc
内でexport
を使って値を設定すれば出来ます。
再度vim ~/.zshrc
で以下のように編集します。
1 2 3 4 |
export SHOPPING_SITE=Amazon #先程追記した行 # 新たに追記 export SHOPPING_SITE=Rakuten |
これでsource ~/.zshrc
でzshrcを読み込み直すと
1 2 3 4 |
$ source ~/.zshrc $ echo $SHOPPING_SITE Rakuten |
上書き完了です。
PATHを理解するために
ここまでで環境変数に値を設定する方法やその環境変数を使用するイメージが掴めてきたかなと思います。
では冒頭で書いた export PATH="$HOME/.rbenv/bin:$PATH"
このような書き方を少しずつ紐解いていきます。
設定ファイル内で環境変数の変数展開を試す
設定ファイル内での変数展開を理解するためにSHOPPING_SITE
に値を上書きする際に使用した書き方を少し変更してみます。
イメージとしてはPATH
の設定をする時に近い感じで記載してみます。
before:
1 2 3 |
export SHOPPING_SITE=Amazon export SHOPPING_SITE=Rakuten |
after:
1 2 3 |
export SHOPPING_SITE=Amazon export SHOPPING_SITE="Rakuten:$SHOPPING_SITE" #この部分を変更 |
これでecho
を実施すると
1 2 3 4 |
$ source ~/.zshrc $ echo $SHOPPING_SITE Rakuten:Amazon |
2回目のexport
時に1回目で設定した変数SHOPPING_SITE
が展開されているのがわかります。
このようにシェルは「""」(ダブルコーテーション)内で$HOME
・$SHOPPING_SITE
のように記載するとその変数を展開する事が出来ます。
注意点として「''」(シングルコーテーションの)だと変数の展開がされません
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 試しに zshrc を以下のように編集 $ vim ~/.zshrc export SHOPPING_SITE=Amazon export SHOPPING_SITE='Rakuten:$SHOPPING_SITE' #シングルコーテーションにしてみる # シングルコーテーションに変更後 zshrc を読み込む直す $ source ~/.zshrc # 変数が展開されていない事が分かる $ echo $SHOPPING_SITE Rakuten:$SHOPPING_SITE |
環境ファイル内のPATHについて紐解く
ここまでの変数が展開されるという事を踏まえ、
~/.zshrc
で仮にPATH
に対して以下のように記載をすると
※ 仮なので実際に設定しないようにして下さい(色々なコマンドが動かなくなる危険性しかないので)
1 2 3 4 5 6 7 8 9 10 |
# 環境変数PATHに対して値を設定 export PATH=bin # 変数が展開され # PATH=sbin:bin と同義 export PATH="sbin:$PATH" # HOME=/Users/yuu のため # PATH=/Users/yuu/bin:sbin:bin と同義 export PATH="$HOME/bin:$PATH" |
1 2 3 4 |
$ source ~/.zshrc $ echo $PATH /Users/yuu/bin:sbin:bin |
このようになります。
つまり
export PATH="$HOME/.rbenv/bin:$PATH"
は、この記述より上で設定したPATH
の前に$HOME/.rbenv/bin:
を追加する書き方になります。
長々と書きましたがPATH
の本質部分となる、
- なんで2回目以降の設定をする際に$PATHの前に記載してんの?
- なんで「:」を使うの?
は次の記事に記載します。
あとがき
環境変数なんてそんな大したもんじゃない、ぐらいの浅い気持ちで過ごしていました。
が、コマンドを実行する上できちんと理解した方がいいんだなとプログラム始めて6年目ぐらいで気付くという。笑