PATH (変数)
本稿では、UNIX系OSやDOS、OS/2およびMicrosoft Windowsにおける環境変数の1つであるPATH
について解説する。PATH
には、ファイルシステム内の実行ファイルが存在するディレクトリを列挙する。通常、実行中のプロセスやログインセッションごとに、別々にPATH
が設定される。
歴史
[編集]パスを検索するというアイディアは、Multics を嚆矢とする。初期のUNIXシェルでは、実行ファイルの名前検索は/bin
のみを対象として行われていた。しかし、UNIX Ver.3 になると、このディレクトリ・サイズが限界を超え、/usr/bin
とパスの検索機能がOSに追加された[1]。
UNIXおよびUNIX系OS
[編集]POSIXとUNIX系OSでは、$PATH
変数に対し1つ以上のディレクトリ名を、区切り文字にコロン(:
)を用いて列挙した文字列が指定される[2][3]。
$PATH
文字列内のディレクトリ名に対してはエスケープ文字の処理が行われないため、その名前にコロンを含めることはできない[4]。
ディレクトリ/bin、/usr/bin、usr/local/bin
は、通常ほとんどのユーザーの$PATH
に含まれている(実装ごとの差異は存在する)。スーパーユーザーの場合、システム管理用コマンドを簡便に実行できるよう/sbin
と/usr/sbin
が含まれている。往々にしてユーザーの手によって、カレントディレクトリを示すドット(.
)が挿入される。これにより、カレントディレクトリに存在するプログラムを、直接実行できるようになる。
システムアドミニストレーターは、例えばカレントディレクトリ内に何らかの手段で仕込まれた悪意あるスクリプトの実行を防ぐ目的で、$PATH
内へのドットの挿入を禁止することがある。この場合にプログラムをコマンドライン上から実行するには、絶対パス(/home/userjoe/bin/script.sh
)か相対パス(./script.sh
)を用いて入力する必要がある。
ユーザーによる直接入力や、何らかのプログラムからexec
システムコールによってコマンド名が指定された場合、システムは$PATH
内に記載されたディレクトリを、先頭から順番に走査して入力された名前に合致するファイル名を検索する。ファイルが見つかれば、コマンドシェルもしくはそのコマンドをコールしたプログラムの子プロセスとして、そのプログラムは実行される。
DOSやOS/2、Microsoft Windows
[編集]DOSやOS/2、WindowsなどのOSでは、%PATH%
変数に対し1つ以上のディレクトリ名を、区切り文字にセミコロン(;
)を用いて列挙した文字列が指定される[5][6]。
通常、Windowsのシステムディレクトリ(通常はC:\WINDOWS\system32
[注釈 1])は先頭に置かれ、続いて多くのインストールされたソフトウェア用のディレクトリが列挙される(全てではない)。cmd.exeのようなコマンドラインシェルからの起動を想定せず、Windows ExplorerのようなGUIからの起動を想定している多くのプログラムのディレクトリは、%PATH%
に含まれない。プログラムの中には、インストールの際に自分のディレクトリを%PATH%
変数の先頭に置き、名前検索の高速化やOSのコマンドの無効化を意図するものもあった[要出典]。一般的にDOSが利用されていた時代には、慣習的にAUTOEXEC.BATに対してPATH {program directory};%PATH%
やSET PATH={program directory};%PATH%
といった行が追記されていた。
コマンドラインシェルからコマンドが入力されたりシステムコールによってプログラムが呼び出されたりした場合、システムは最初にカレントディレクトリを検索し、次に%PATH%
内を先頭から順に走査していって、与えられたコマンドと同じ名前の実行可能なファイルを探す。実行可能なファイル名には拡張子にEXE
かCOM
が、またバッチスクリプトではBAT
やCMD
が付されている。他の拡張子も実行可能ファイルとしてシステムに登録できる。
実行可能なファイルが見つかったら、システムはそれを起動するための新しいプロセスを生成する。
PATH
変数を利用することで、各々のディレクトリ(フォルダー)内に配置された日常的に使うプログラムを容易に起動できるようになる。しかし使い方を誤れば、PATH
変数の値によっては多数の場所や無効な場所をむやみに検索することになり、OSのパフォーマンス(実行速度)を低下させてしまう。
無効なディレクトリの存在は同時に実行している様々なサービスを停止させ、特にWindows Server環境内で通例他のサービスにとっての依存関係である「Server」サービスに悪影響を与える。
Windowsの環境変数には大別してシステム環境変数・ユーザー環境変数・プロセス環境変数の3つがあり、レジストリに保存されたシステム環境変数とユーザー環境変数が、プロセス起動時に合成されてプロセス環境変数になる。システムとユーザーに同じ名前の環境変数が存在する場合、ほとんどの場合はシステム環境変数よりもユーザー環境変数が優先される[7]。ただし、%PATH%
に関しては内部的にシステム環境変数の後にユーザー環境変数が追加されて結合されるため、もし同じ名前の実行ファイルが複数存在する場合、探索順位としてはシステム環境変数のディレクトリにあるものが優先される[8]。
脚注
[編集]注釈
[編集]- ^ システム環境変数には既定でこの通りに設定されている。一般的には
C:\Windows\System32
だが、Windowsではパスの大文字・小文字の違いは無視される。
出典
[編集]- ^ マキルロイ, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. ベル研究所. 139。
- ^ “Environment Variables” [環境変数] (英語). The IEEE and The Open Group (2004年). 2022年12月18日閲覧。
- ^ “exec” (英語). The IEEE and The Open Group (2004年). 2022年12月18日閲覧。
- ^ Dash exec.c(パス文字列パーサの実装例として), 174
- ^ “PATH” (英語). Microsoft Learn. Microsoft (2010年3月19日). 2022年12月18日閲覧。
- ^ path | Microsoft Learn
- ^ ASCII.jp:Windowsにおける環境変数をあらためて整理する (1/2)
- ^ 【Windows 11対応】Path環境変数を設定/編集して、独自のコマンドを実行可能にする:Tech TIPS - @IT