読めばわかるMACでのPATH設定を完全理解
目次
環境変数PATHとは
環境変数PATHは、コマンドを実行するプログラムが保存されているディレクトリの場所を設定する変数です。
なぜpwdコマンドが実行できるのか
環境変数PATHの説明を聞いても最初理解することは非常に難しいです。環境?変数?さっぱり意味がわかりません。理解できたとしてもなぜ環境という言葉を使うのかはわからないかもしれません。
言葉の意味を聞いて理解するよりも動作させながら少しずつ理解を深めていくのが最善の方法だと思いますのでコマンドを使いながら説明を行っていきます。
現在ユーザがいるディレクトリを確認するpwdコマンド(print woking directory)を通して、環境変数PATHを理解していきましょう。
MACでターミナルを起動し、pwdコマンドを実行すると実行時にユーザがいるディレクトリの場所が表示されます。この/Users/macのことをPATH(パス)と呼びます。
ターミナルは上部のメニューの移動→ユーティリティを選択すると表示されるフォルダの中で見つけることができます。実行すると下記のような画面が表示されます。下記の画面の中でコマンドを入力していきます。
% pwd
/Users/mac
では、なぜpwdコマンドを実行できるのでしょうか?
コンピューターで何かの処理を行うためにはプログラミング言語で記述されたファイルを実行する必要があります。pwdコマンドが実行できるということはこのファイルの保存場所がどこにあるのかを知っておく必要があります。
lsコマンドを実行して現在のディレクトリに存在するファイルを確認してみましょう。
lsコマンドを実行しても現在いるディレクトリにはpwdの実行ファイル(pwdと同じ名前のファイル)はありません。
mac$ ls
Applications
Desktop
Documents
Downloads
Library
Movies
Music P
ictures
Public
先ほどの説明では必ずコマンドに対応するファイルが存在すると言ったのにpwdといったファイルもlsといったファイルも存在しません。しかし、pwdコマンドもlsコマンドも実行できました。
では、pwdの実行ファイルはどこにあるのでしょうか?
コマンドがどこにあるのかを教えてくれるコマンドも存在します。それがwhichコマンドです。
whichコマンドを実行するとpwdの実行ファイルの場所を確認することができ/binディレクトリの下に存在することがわかります。
% which pwd
/bin/pwd
% which ls
/bin/ls
whichコマンドを利用することでpwdコマンドは、/binディレクトリの下にあることはわかりましたが、なぜbinの下にあるpwdコマンドを/Users/macから実行することができるのでしょう。
pwdコマンドが存在する場所は/bin/lsということがわかりました。ではなぜlsコマンドを実行することができるのでしょう。
ユーザがいる場所は存在しないpwdコマンドを実行するために重要な役割をするのが環境変数PATHです。
printenvコマンドにより環境変数一覧を表示
環境変数PATHというものがコマンドを実行するために重要な役割をすると説明をしました。では環境変数とは一体なんなのでしょう。環境変数は何なのか確認するために環境変数を表示してみましょう。
Macには環境変数を一覧表示するprintenvというコマンドが備わっています。
printenvを実行するとさまざまな情報が表示されますが、表示されている中からPATHという文字列を探してください。
% printenv
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/5h/bxvtcnj978dfmqwdkr59xvj40000gn/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.FWsThb4MSd/Render
TERM_PROGRAM_VERSION=421.1
TERM_SESSION_ID=A16EEA5A-E4A8-4F62-99B9-2CE967439E34
USER=mac
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.SI0Id5ua6b/Listeners
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PWD=/Users/mac
LANG=ja_JP.UTF-8
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
SHLVL=1
HOME=/Users/mac
LOGNAME=mac
SECURITYSESSIONID=186a8
_=/usr/bin/printenv
上から順番に見ていくと真ん中あたりにPATHという文字列があるかと思います。環境変数PATHには、/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinが設定されていることがわかります。
このPATHの設定値の中にpwdの実行ファイルが存在した/binディレクトリがあることが確認できます。先ほど実行したpwdコマンドは/binの下にあったことを思い出してください。環境変数PATHがこの情報を持っているからこそ/binディレクトリに存在するpwdコマンドが実行できるのです。
echoコマンドによるPATHの確認
先ほどはPATHを含め、設定されている環境変数すべてが表示されましたが、echoコマンドにより個別の環境変数の設定値を確認することができます。
% echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
pwdコマンドの実行時の流れ
ここまでの説明でpwdコマンドは/bin/ディレクトリの下に存在することがわかりました。また環境変数PATHというものが存在し、その環境変数にはpwdコマンドが存在する/binディレクトリの情報を持っていることがわかりました。
環境変数PATHの力を借りてどのようにpwdコマンドが実行されるのか流れをみていきましょう。
- ターミナルを起動してpwdコマンドを実行
- 環境PATHの中身を確認(/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin)。
先頭に記述されているディレクトリから順番にそのディレクトリ下にpwdの実行ファイルがあるかを確認していきます。 - 最初に環境変数PATHの先頭に表示されている/usr/local/binの下にpwdの実行ファイルがあるか確認します。存在しない場合は、次に記述されているディレクトリを確認します。
- /usr/binの下にpwdの実行ファイルがあるか確認するが存在しない場合は、次に記述されているディレクトリを確認します。
- /binの下にpwdの実行ファイルがあるか確認し、pwdコマンドが存在することを確認。
- /binが存在することが確認できたのでようやくpwdの実行ファイルを実行することができます。
ここまでの読み進めてもらえれば環境変数PATHがどのように利用されるのかを理解することができます。
PATHを通すとは
購入直後のMacには存在しないコマンドを例にしてPATHを通すとは何かを説明していきます。特にサーバなどのインフラ系で働くとすぐに耳にするのがこのPATHを通すという言葉です。何かコマンドを実行して実行できない場合に同僚からそのコマンドPATHがちゃんと通っているか確認しておいてといった使われ方をします。この文書の残りを読み進めればPATHを通すの意味とPATHの通し方を理解することができます。
PATHの理解のためPHPのパッケージ管理のcomposerをインストールした場合に作成される実行ファイルを利用します。
composerをインストールするとインストールを実行したディレクトリにcomposer.pharという実行ファイルが作成されます。インストールディレクトリは、/Users/mac/Documentsで行っています。
composer.pharを実行してみましょう。
mac$ pwd
/Users/mac/Documents
mac$ ls
composer.phar
mac$ ./composer.phar -V
Composer version 1.8.0 2018-12-03 10:31:16
しかし、/Users/macディレクトリに移動して実行するとcommand not found(コマンドが見つかりません)のエラーが表示されます。
mac$ composer.phar
-bash: composer.phar: command not found
ではcomposer.pharをインストールを実施したディレクトリ(/Users/mac/Documents)以外で実行するにはどうすればいいのでしょう。
新たに環境変数のPATHにcomposer.pharのPATH(パス)を追加することでどこのディレクトリからもcomposer.pharを実行できるようになります。
この設定作業をcomposer.pharの”PATHを通す”といいます。
設定方法はexportコマンドを利用して環境変数PATHに新たなPATHを追加します。追加後、/Users/macからでもcomposer.pharを実行することができます。
$PATHには現在設定されているPATHの情報が含まれています。その値に追加したい場合は:(コロン)の値に追加したいパスを指定します。
mac$ export PATH=$PATH:/Users/mac/Documents
mac$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/mac/Documents
mac$ pwd
/Users/mac
mac$ composer.phar -V
Composer version 1.8.0 2018-12-03 10:31:16
既存のPATHにcomposer.pharが存在する場所の/Users/mac/Documentsを追加することでcomposer.pharが存在する場所(/Users/mac)とは異なる場所からもコマンドを実行できることがわかりました。しかし、exportコマンドで実行した設定は一時的なもので、別のターミナルを起動するとその設定は解除されてしまいます。
.bash_profileファイルに環境変数PATH設定
exportコマンドでは環境変数の値を永続的に保持することができません。そのため、.bash_profileファイル(使用しているシェルがzshシェルの場合は.zshrcになります。bashシェルの場合は.bash_profileです。)を使用して、環境変数PATHの値を保持させます。
mac$ echo 'export PATH=$PATH:/Users/mac/Documents' >> .bash_profile
.bash_profileファイルを作成後、再度ターミナルを開いて、composer.pharを実行するとPATHが通っているため、実行することできます。
mac$ composer.phar -V
Composer version 1.8.0 2018-12-03 10:31:16
/usr/local/binへの実行ファイルの保存
ここからの作業は管理者権限が必要となるため、管理者権限がない場合は実行できません。
exportコマンドを使用して、環境変数PATHの追加を行いましたが、環境変数PATHに追加するのではなく、事前に環境変数PATHに設定されている/usr/local/binに実行ファイルを保存するという方法もあります。その場合は、.bash_profileの作成も必要ありません。
MACではインストール直後では、/usr/localにbinディレクトリは存在しないので作成を行います。作成完了後に実行ファイルを保存します。
通常ユーザで/user/localにbinディレクトリを作成しようとするとアクセス権の問題で管理者のパスワードが必要となるため、通常のユーザでは作成できません。
mac$ mkdir /usr/local/bin
mkdir: /usr/local/bin: Permission denied
管理者権限で作成するためにsudoコマンドを利用します。binディレクトリを作成後、composer.pharをbinディレクトリに保存します。その際も管理者権限が必要となります。
mac$ sudo mkdir /usr/local/bin
Password:
mac$ sudo mv composer.phar /usr/local/bin/composer
/user/local/binに保存できれば、どこのディレクトリからも実行が可能です。
mac$ pwd
/Users/mac/Music
mac$ composer -V
Composer version 1.8.0 2018-12-03 10:31:16
まとめ
ここまで読んでもらえれば、冒頭に記載した、”環境変数PATHは、コマンドを実行するプログラムが保存されているディレクトリの場所を設定する変数”という意味が理解できたかと思います。環境変数というものはMacだけに限らず、Windowsにも存在するもので、ここで環境変数PATHを理解することができれば今後PATHの設定について困ることはほとんどなくなります。PATHの設定はOSによって異なるので設定方法はその都度確認する必要はあります。