環境変数PATHとは

環境変数PATHは、コマンドを実行するプログラムが保存されているディレクトリの場所を設定する変数です。

なぜpwdコマンドが実行できるのか

環境変数PATHの説明を聞いても最初は理解は難しいものです。現在ユーザがいるディレクトリを確認するpwdコマンド(print woking directory)を通して、環境変数PATHを理解していきましょう。

MACでターミナルを起動し、pwdコマンドを実行すると実行時にユーザがいるディレクトリの場所が表示されます。ユこの/Users/macのことをPATH(パス)と呼びます。


mac$ pwd
/Users/mac
ユーザがいる場所といってもピント来ない人はWindowsでフォルダを開いてその中にあるファイルをクリックするのを思い浮かべてください。このファイルをクリックしたフォルダが現在ユーザがいる場所を表します。コマンドラインを使用した経験が少ない人にはこの場所という概念を理解するのが難しいかもしれません。

では、なぜpwdコマンドを実行できるのでしょうか?

コマンドにはコマンド名と同じファイル名の実行ファイルがMacのどこかに必ず存在します。

lsコマンドを実行しても現在いるディレクトリにはpwdの実行ファイル(pwdと同じ名前のファイル)はありません。

lsコマンドは指定したディレクトリ内のファイルの一覧を表示するコマンドです。ディレクトリを指定しない場合は、実行したディレクトリ内のファイル一覧が表示されます。

mac$ ls
Applications
Desktop
Documents
Downloads
Library
Movies
Music
Pictures
Public

では、pwdの実行ファイルはどこにあるのでしょうか?

whichコマンドを実行するとpwdの実行ファイルの場所を確認することができ/binディレクトリの下に存在することがわかります。

whichコマンドは、実行ファイルが保存されている場所を見つけるコマンドです。

mac$ which pwd
/bin/pwd

pwdコマンドは、/binディレクトリの下にあることはわかりましたが、なぜbinの下にあるpwdコマンドを/Users/macから実行することができるのでしょう。

どこかにpwdの実行ファイルが/binディレクトリに保存されているという情報が保存されていることが予想できます。

その情報が保存されている場所が環境変数PATHなのです。

printenvコマンドにより環境変数一覧を表示

環境変数PATHというものがMAC上に存在するということだけわかりました。環境変数はコマンドを使用して環境変数PATH保存されている情報を確認することができます。MACにおける環境変数を確認するためには、printenvコマンドを実行します。さまざまな情報が表示されますが、PATHを探してください。


mac$ 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の下にあったことを思い出してください。この設定のおかげでpwdコマンドが実行できたのです。

echoコマンドによるPATHの確認

先ほどはPATHを含め、設定されている環境変数すべてが表示されましたが、echoコマンドにより個別の環境変数の設定値を確認することができます。


mac$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

pwdコマンドの実行時の流れ

環境変数PATHの情報が取得できたので、pwdコマンドを実行した時の流れを確認しましょう。

  1. pwdコマンドを実行
  2. 環境PATHを確認(/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin)。
    先頭に記述されているディレクトリから順番にそのディレクトリ下にpwdの実行ファイルがあるかを確認していきます。
  3. /usr/local/binの下にpwdの実行ファイルがあるか確認するが存在しない場合は、次に記述されているディレクトリを確認します。
  4. /usr/binの下にpwdの実行ファイルがあるか確認するが存在しない場合は、次に記述されているディレクトリを確認します。
  5. /binの下にpwdの実行ファイルがあるか確認し、pwdコマンドが存在することを確認。
  6. /binの下にあるpwdの実行ファイルが実行されます

ここまでの読み進めてもらえれば環境変数PATHがどのように利用されるのかを理解することができます。

PATHを通すとは

PHPのパッケージ管理のcomposerをインストールした場合に作成される実行ファイルを利用して、PATHの理解をさらに深めていきましょう。composerをインストールするとインストールを実行したディレクトリにcomposer.pharという実行ファイルが作成されます。インストールディレクトリは、/Users/mac/Documentsで行っています。

ここではcomposer.pharという実行ファイルを通して説明しますが、実行ファイルについては自分の作ったものでも他のパッケージのファイルでも構いません。方法はすべて同じです。

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
“./composer.phar”の”./”は現在のディレクトリの中にあるcomposer.pharを実行することを意味しています。

しかし、/Users/macディレクトリに移動して実行すると下記のエラーが表示されます。


mac$ composer.phar
-bash: composer.phar: command not found

ではcomposer.pharをインストールを実施したディレクトリ(/Users/mac/Documents)以外で実行するにはどうすればいいのでしょう。

新たに環境変数のPATHにcomposer.pharのPATH(パス)を追加することでどこのディレクトリからもcomposer.pharを実行できるようになります。

この設定作業をcomposer.pharの”パスを通す”といいます。

設定方法はexportコマンドを利用して環境変数PATHに新たなPATHを追加します。追加後、/Users/macからでもcomposer.pharを実行することができます。


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

しかし、exportコマンドで実行した設定は一時的なもので、別のターミナルを起動するとその設定は解除されてしまいます。

.bash_profileファイルに環境変数PATH設定

exportコマンドでは環境変数の値を永続的に保持することができません。そのため、.bash_profileファイルを使用して、環境変数PATHの値を保持させます。

.bash_profileはユーザがターミナルを新規で開いた場合に読み込まれるファイルです。このファイルに設定を加えれば、ターミナルを開いた時にその中に記述した設定を反映することができます。
MACインストール直後では.bash_profileは存在しないので、下記のコマンドを使用して.bash_profileを作成し、そのファイルの中にexportコマンドの設定を記述します。


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ディレクトリは存在しないので作成を行います。作成完了後に実行ファイルを保存します。

環境変数PATHにはいくつかのディレクトリが設定されています。/usr/local/binはユーザが追加のパッケージをインストールした場合の実行ファイルを保存します。/usr/bin, /binにはユーザが使用するOS標準のコマンドが保存されています。sbinには、管理者が使用するコマンドが主に保存されます。

通常ユーザで/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によって異なるので設定方法はその都度確認する必要はあります。