LinuxやWindowsでのプロンプトから入力されたコマンドのコマンドサーチ順位をまとめてみました。
LinuxなどのUNIX系では、プロンプトから入力するコマンドのコマンドサーチ順位は、以下のようになっています。
- コマンドをパス(絶対・相対)から指定(外部コマンド)
- シェルの組み込みコマンドの指定(内部コマンド)
- 環境変数PATHをコマンドサーチパスでの指定(外部コマンド)
尚、外部コマンドはwhichコマンドで確認し、内部コマンドはtypeコマンドで確認ができます。
$ type echo echo is a shell builtin $ which echo /usr/bin/echo
ちなみに、echoコマンドは昔は外部コマンドで、今は内部コマンドになっているようです。
つまり、パス指定をしなければ、echoコマンドは内部コマンドが優先される。
Windows系では、以下のようになっています。
- コマンドをパス(絶対・相対)から指定(外部コマンド)
- シェルの組み込みコマンドの指定(内部コマンドcmd.exe)
- カレントディレクトリにあるコマンドの指定(外部コマンド)
- 環境変数PATHをコマンドサーチパスでの指定(外部コマンド)
UNIX系との大きな違いは、Windows系ではカレントディレクトリにあるコマンドが、環境変数PATHより優先されることですね。
UNIX系では、カレントディレクトリでさえも、環境変数PATHに入っていないとなりません。
また、Windows系では拡張子なしでコマンド起動ができます。同名のコマンドで拡張子が異なる場合のコマンドは、以下のような優先順になっています。
- .COM
- .EXE
- .BAT
あと、優先順は調べきっていないのですが、以下の種類のファイルも拡張子無しで実行ができますね。
- .js
- .vbs
- .wsf
拡張子について、以下のように、otnさんから教えていただきました。
また、コマンドでなく、APからコールされる標準のDLL検索パスは以下のようです。
http://blogs.wankuma.com/tocchann/archive/2008/03/14/127679.aspx
- アプリケーション(EXE、すなわちホストプロセス)のあるディレクトリ
- システムディレクトリ。GetSystemDirectory API で取得できるディレクトリ
- 16bit 版のシステムディレクトリ(互換性に起因するもの。64bitOSだとたぶん使われないと思いますが正直不明w)
- Windows ディテクトリ。GetWindowsDirectory API で取得できるディテクトリ
- カレントディテクトリ
- PATH 環境変数に指定されているフォルダ(SafeDllSearchMode を操作すると除外可能)
- レジストリの、App Paths キーで指定されている特別なフォルダ(インストーラで設定されます)