Windowsのパスは先に書いたモノから読み込まれる。一瞬あとのほうが上書き的な意味で有線かと思ったけど。FIFOだということだ。
衝突が起きるようなPATH
テスト用に次の2ファイルを準備しました。
'C:\Users\takuya\apps\vim\vim73\vim.exe';
'C:\Users\takuya\apps\vim\gvim72\vim.exe';
vim/gvim の中に、vim.exeという同名のコマンドが入っています。名前が衝突します。
衝突するようにPATHを設定しました
PATH=C:\Users\takuya\apps\vim\vim73;C:\Users\takuya\apps\vim\gvim72
実行してみました。
C:\Users\takuya>vim
先に見つかったモノから実行されます。この場合は、CUIのvimが先に実行されます。
where コマンドで名前の衝突を確認する。
あれ、おかしいな、と思ったら、where コマンドで確認します。
C:\Users\takuya>where vim
C:\Users\takuya\apps\vim\vim73\vim.exe
C:\Users\takuya\apps\vim\gvim72\vim.exe
Findコマンドも、衝突する定番ですね。
C:\Users\takuya>where find
C:\Windows\System32\find.exe
C:\Users\takuya\apps\gnuwin32\bin\find.exe
ほかにも、Python2.6/Python2.7だとかRuby1.8/ruby1.9が衝突の定番ですね
上記の「環境変数PATH」をさらに詳しくいえば、
- カレントディレクトリ
- 環境変数 PATH
- Registry "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"
Windows の path 自動検索機能
の順で探されるらしい。
3.は馴染みがないですが。
3.の存在自体初めて知りました。
"excel" と打って実行できるのは 3 のしくみです。
とのことです。僕も知らなかった!!
実際に見てみたら、python.exeがココに定義されていた。Pythonマナーいいね。
PATHはさらに細分化していて
- ユーザ環境変数
- システム環境変数
に分割されて管理されている。
それぞれは、次のレジストリに格納されている。
- ユーザー環境変数
- HKEY_CURRENT_USER\Environment\Path
- システム環境変数
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
レジストリ値なので、レジストリを変更したらログオフ(または再起動)すれば反映される。
再起動せずに反映させる方法
ログオフせずにこれらの変更を有効にするには、関連するアプリケーション (エクスプローラ、プログラム マネージャ、タスク マネージャ、コントロール パネルなど) が更新を行えるように、システム内のすべてのウィンドウに WM_SETTINGCHANGE メッセージをブロードキャストします。
レジストリの値は、再起動せずに反映させる方法がある。いまだに再起動を求めてくるシステムとか信じられないよね。LismoとかリスモとかLISMOとか。日本のシステム開発ベンダってヒドイなって思うわ。共用ライブラリ入れたわけでもないのに再起動求めてくるとかホント意味が分からない。
環境変数は、システム環境変数をユーザー環境変数で上書きできるのですが、PATHだけはなぜか上書きされない。僕はPATHを上書き(優先度を変更)したいのですが・・・やり方が分かりません
どうやら固定の可能性が。。。
PATHについては固定の可能性がある。
ユーザー環境変数もコントロール パネルで同様に表示することができます。ユーザーは、[<ユーザー名>のユーザー環境変数] フィールドで環境変数を追加、削除、または修正することができます。これらの変数は、システム環境変数よりも優先されます。ユーザー パスは、システム パスの後ろに付加されます。
しかしWindowsに限ってそれはないはず。