[雑談] パスと環境変数
最近、Windowsのパス設定でよくわからないことが発生したので、パスと環境変数について少し考えてみました。
まとめ
とりあえずWindowsでのパス設定の基本をまとめておきます。
- パスに新しいディレクトリパスを追加する際は「ユーザーの環境変数」の最後に「新規」でディレクトリパスを追加する
- ディレクトリパスはキーボードから入力するのではなく、エクスプローラのアドレスバーからコピーする
- 環境変数ダイアログを閉じた後にコマンドプロンプトを起動して、パスが設定されているかを確認する
- うまく動かない場合はコマンドプロンプトでpathコマンドを実行してパスの設定状況を確認する
以下、だらだらとパスについて思ったことを書いています。
パス (Path)
何らかのプログラムを実行するには実行対象のプログラムファイルを特定する必要があります。
CP/M-80やDOS 1.xを使っていた時代には階層ディレクトリ構造が存在していなかったため、"C:MASM ..."のようにファイル名を指定するだけでプログラムファイルが特定され、実行することができました。
しかし、大容量のハードディスクを使用するようになると保存できるファイルの数が膨大になって、1個のディレクトリでは管理できなくなり階層ディレクトリ構造が導入されました。
そしてプログラムファイルを指定する方法としてドライブのトップディレクトリからのディレクト階層をすべて記載した ("C:\DOS\MASM ..."のような) フルパス表記が導入されました。
※ パスの表記はUnixのスラッシュ "/" で区切る表記を参考にしたものと思われますが、スラッシュはCP/M-80の時代からプログラムオプションに使用されているので、見た目が似ている逆スラッシュ "\" を使用したものと思われます。
※ JIS X 0201ではASCIIの逆スラッシュに対応した文字コード (0x5c) に円記号 ”¥” が割り当てられているため、日本語環境ではディレクトリを分離する文字が円記号となっています。
さすがに毎回フルパス表記を行うのは面倒なので、同時にパスという機能が導入されました。
パスは実行するプログラムを指定する文字列にディレクトリを分離する文字が含まれていない場合に、プログラム名として指定されたプログラムをパスで指定されたディレクトリから検索して、見つかればそれを実行するという仕組みです。
先の例でいえば、パスが "C:\DOS;C:\WM" のような指定になっていれば "MASM ..." という指定を行うだけで "C:\DOS\MASM.exe" が実行されるといった仕組みです。
ところで、パスの指定方法もUnixを参考にしたと思われるのですが、ディレクトリパスを分離する文字がUnixではコロン ":" が使われているのに対して、DOSはコロンをドライブ指定文字に使っているため、セミコロン ";" が使われています。
パスの指定方法
パスは環境によって異なります。例えばハードディスクドライブを2台以上接続していて、それぞれのドライブに分散してプログラムファイルがおかれている場合にはCドライブ上のディレクトリパスとDドライブ上のディレクトリパスといったように複数のディレクトリパスを書かなければなりません。
これを実現するためにDOSではautoexec.batという名前のバッチファイルがドライブのトップディレクトリに存在する場合、ドライブをマウントする際に自動的に実行するという仕様になっています。
このautoexec.bat内でパスを指定することで環境に応じたパス設定が行われるという仕組みです。
現在のWindowsにおけるパスの指定
パスとプログラム起動の仕組みはWindowsになっても大きく変わってはいませんが、いくつかの理由によりautoexec.batによるパスの指定という仕組みは使用されなくなり、システムの詳細設定 (システムのプロパティ) ダイアログから環境変数ダイアログを表示して編集する仕組みになっています。
スタートメニューの「設定」(歯車アイコン) を選択して「設定」画面を表示し、「システム」の「バージョン情報」(Windows 10では「詳細情報」) にある「システムの詳細設定」をクリックして「システムのプロパティ」ダイアログを表示します。
「システムのプロパティ」ダイアログの右下に「環境変数」のボタンがあるので、それをクリックすると「環境変数」ダイアログが表示されます。
Windowsの環境変数には「システムの環境変数」と「ユーザーの環境変数」の2種類の環境変数があります。
「システムの環境変数」はそのパソコンで使用するユーザ全員に共通して適用される環境変数で、PathにはWindows標準コマンドプログラムが保存されているディレクトリパスなどすべてのユーザが使用するプログラムへのパスが記録されています。
「ユーザーの環境変数」はログインユーザにだけ適用される環境変数で、同じ名前の環境変数がシステムの環境変数とユーザーの環境変数の両方に存在する場合はユーザーの環境変数に設定した内容だけが有効になります。
しかし、Pathだけは特別で、システムの環境変数で設定したパスの後ろにユーザーの環境変数で設定されたディレクトリパス群が連結されるようになっています。
※ 同じ環境変数なのにPathだけ特別扱いするといった「使いやすさ」がかえって使いにくくしている気がするけど、そればまた別の話題。
普通、自分用のパソコンは自分が管理者になっているので、システムの環境変数を設定できてしまいますが、システムの環境変数のPathにはシステムが設定した重要なプログラムへのパスが記録されているので、間違って壊してしまうとあとで面倒なことになります。
ですので、インストーラを持たないプログラムをインストールした際にはユーザーの環境変数の側のPathを修正して、インストールしたプログラムへのディレクトリパスを追加することが推奨されます。
また、プログラム起動時にはパスに設定されているディレクトリパスを前から順に調べていきますので、新しいディレクトリパスをそれまで登録されていたディレクトリパスより前に配置すると、同じ名前の実行ファイルがあった場合に新たに追加したディレクトリパスにある実行ファイルが実行されるために期待した動作が行われない可能性があります。
このため、パスにディレクトリパスを追加する際にはリストの最後に追加するのが安全です。
運悪く別々のディレクトリパスにある同名の実行ファイルの両方を使う必要がある場合はパスでは対応できないので何等かほかの手段を考えるべきです。
例えば対応するJavaバージョンが異なる複数のJavaアプリケーションを開発しているといった場合には開発プロジェクトの作業ディレクトリにjavaを起動するバッチファイルを用意しておいて、バッチファイル内でパスなどの環境変数を設定してからjavaを起動するといったことを考えるのがいいかと思います。
さて、最後にディレクトリパスを指定する手順です。
人間は間違う可能性のあるものは必ず間違えるものです。
パスにディレクトリパスを入力する際にはキーボードから打ち込むのではなく、エクスプローラで実行ファイルが存在するフォルダを開き、アドレスバーの空白部分をクリックしてディレクトリパスが全選択された状態にします。
その状態でCtrl-Cを入力してディレクトリパス文字列をコピーし、パスの入力領域にCtrl-Vでペーストすると間違える可能性は低くなると思います。
設定が終わったら環境変数ダイアログを閉じてシステムに更新したことを伝え、コマンドプロンプトを起動してコマンドが実行できるか、パスが正しく設定されているかを確認してください。
うまく動かないときはコマンドプロンプトでpathコマンドを実行して、追加したディレクトリパスが設定されているかを確認してください。
なお、パス以外の環境変数は%環境変数名%で参照することができます。
例えばコマンドプロンプトで "echo %JAVA_HOME%" と入力するとJAVA_HOME環境変数の内容を見ることができます。
以上、ご参考まで。
0コメント