環境変数とパス(Path)
PC用語でパス(Path)といったら、ファイルやフォルダのある場所を指す文字列のことです。
それが、「パス(Path)を通す」という言葉になるとパスの意味あいが若干かわります。筆者自身駆け出しの頃、この「パスを通す」という意味がよくわからなかったのでここに関連が深い環境変数とともに覚書を残しておきます。
環境変数
少し遠回りになりますが、環境変数から把握していた方が理解しやすいと思いますので先にその説明をしておきます。
「環境変数」は文字通り利用環境における変数です。例えばWindowsではTMPという名前の変数に、一時フォルダの場所が格納されています。
この中身を確認するためにはコマンドプロンプトのechoコマンドを使って確認できます。コマンドプロンプトでは、変数を読みだす際は%で囲むというルールがあります。
C:¥Users>echo %TMP% C:¥Users¥username¥AppData¥Local¥Temp
Power Shellでは、「$Env:tmp」とすることで確認が可能です。先頭の$記号はPower Shellにおける変数を意味します。
C:¥Users>$Env:TMP C:¥Users¥username¥AppData¥Local¥Temp
Windowsにおいて、「TMP」という名前の環境変数は、アプリなどが一時フォルダの場所を取得する際に利用されます。コマンドプロンプトやPower Shellから呼び出せたように他の様々なアプリからその値を呼び出して利用することができます。
なので多くのWindows上で動くアプリは、一時保存フォルダを探したい場合にTMPという環境変数の値を探すようになっています。
また、環境変数と言った場合、WindowsやDebianといったOSのそれを指すことが多いですが、例えばWebでおなじみのApacheサーバーでも「環境変数」というものが存在していて、これはOSの環境変数とは別に存在しています。繰り返しになりますが、特定の環境において利用される変数ということです。
OS環境変数におけるPath
OSの環境変数のひとつとして「Path」という名前のものがあります。これが「パスを通す」という行為に関係してきます。まず、この中身を読みだしてみると、今度は複数のフォルダが;(セミコロン)に区切られて出力されます。
C:¥Users>echo %Path% C:¥Program Files¥Eclipse Foundation¥jdk-8.0.302.8-hotspot¥bin;C:¥Program Files¥ImageMagick-7.1.0-Q16-HDRI;C:¥WINDOWS¥system32;C:¥WINDOWS;C:¥WINDOWS¥System32¥Wbem;C:¥WINDOWS¥System32¥WindowsPowerShell¥v1.0¥;C:¥WINDOWS¥System32¥OpenSSH¥;c:¥nvm;c:¥nvm¥symlink;C:¥Program Files¥Git¥cmd;
;で区切られたフォルダは「パスが通っている」状態です。
たとえば「C:¥WINDOWS¥system32」は環境変数Pathの中に値があるので、「C:¥WINDOWS¥system32はパス(Path)が通っています」。ここにないフォルダ例えば「C:¥sample」フォルダを環境変数のPath加えることを「C:¥sampleにパス(Path)を通す」と言います。
Pathが通っているとどうなるか
Pathが通っている(=環境変数の中にフォルダの場所が記述してある)と、コマンド実行時にそのフォルダの記述を省略することができます。たとえば、C:¥WINDOWS¥system32にはcmd.exeという先ほど利用したコマンドプロンプトのプログラムの本体がいます。通常特定の場所にあるexeファイルを実行するには、プロンプトでそのフォルダに移動してから実行する必要があります。
C:¥WINDOWS¥system32に移動して実行するか、そうでなければ場所を指定してC:¥WINDOWS¥system32¥cmd.exe)実行しなければいけません。しかし、C:¥WINDOWS¥system32には、Pathが通っているのでcmd.exeはどのフォルダからでもcmd.exeとするだけで実行することが可能です。
# 環境変数にC:\¥indows¥System32の記述がなければ、
# プログラムの実体のいるフォルダに移動して実行するか
PS> cd C:\¥indows¥System32¥
PS> cmd.exe
# パスをすべて入力して実行するかしないといけませんが、
PS> C:\¥indows¥System32¥cmd.exe
# パスが通っているのでファイル名だけで実行できます
PS> cmd.exe
もしcmd.exeがPathの通っている複数のフォルダに存在した場合は先に記述されている方の場所での実行が優先されます。
パスの通し方(Windows10)
「設定の検索」ウインドウに「システムの詳細設定の表示」と入力して「システムの詳細設定」を表示させます。
「環境変数」のボタンをクリックすると、環境変数の一覧が表示されます。Pathにはユーザー毎のものとPC共通のものがあります。どちらか運用にあった方を選択して「編集」ボタンを押します。
Pathの編集画面になるので、追加、修正、削除をして最後に「OK」を押して終了させます。
ここで登録したPathは再起動後に有効になります。再起動させずにPathにフォルダを加えたい場合はPowerShellから次のように操作します。
PS>$Env:Path += ";C:\Sample"
ここで環境変数のPathに加えた変更は、再起動時にはリセットされます。
もしPowerShellで永続的なパスを設定したい場合はMicrosoft:「about_Environment_Variables」に従ってつぎのようにします。ここではPC共通として設定しています。SetEnvironmentVariableコマンドの実行は管理者権限が必要です。
PS>$currentpath = [Environment]::GetEnvironmentVariable('Path', 'Machine') PS>$newpath = $currentpath + ';C:\Sample' PS>[Environment]::SetEnvironmentVariable("Path", $newpath, 'Machine')
パスの通し方(Debian)
Debianでパス(PATH)を通す場合は、/etc/profileに記述します。例として/usr/local/bin/jdk-17+35/に展開されたバイナリ群があるとして、ここにPATHを通してみます。Javaの開発をする方はご存じかと思いますがこのディレクトリはJDKを展開したものです。JDKの場所を示す環境変数「JAVA_HOME」を設定した上で、その場所配下のbinディレクトリをPATHに加えています。
注意したい点は、Windowsでは文字の大文字小文字を区別しませんが、Debianでは区別があります。こちらはすべて大文字のPATHとなることと、区切り文字が;(セミコロン)から:(コロン)になります。
ifの分岐はシステムがデフォルトで作成しているものですが、これで上段が管理者権限の場合のPATH、下段がそれ以外の場合のPATHとなります。
/etc/profile
... JAVA_HOME="/usr/local/bin/jdk-17+35/" if [ "$(id -u)" -eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$JAVA_HOME/bin" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:$JAVA_HOME/bin" fi export PATH ...
PATH=...の部分は、シェル変数に値を設定しています。シェル変数とは、シェルの起動毎に設定が消える(子プロセスでは変数に設定した値は使えない)もので、epxortコマンドを使うことでそれを環境変数にしています。
profileファイルの中身を見ればばかるようのここでの記述はbashのコマンドなので、シェル変数から環境変数へ範囲を変える一連の使い方は、通常のbashおいても共通です。
また、シェル変数に設定してそれをexortする一連の流れは「 export シェル変数=値 」と省略して記述することが可能です。
Debianにおいて、ユーザー毎の設定ファイルには他に、ユーザーホームの.profileと.bashrcがあると思います。もしユーザー毎に環境変数を変更したいなら、.profileに、(そのようなケースがあるかわかりませんが)bash起動毎に変更したいなら.bashrcにPATHを修正するスクリプトを加えます。システムがこれらのファイルを読み込む順序は、/etc/profile、~/.profile、~/.bashrcとなります。
Debianの場合、即時に反映させたい場合は次のようにします。こちらもコマンドで設定しただけの環境変数は再起動時に消えてしまいます。
export PATH=$PATH:/home/user/sample