小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

コマンドサーチ順位

LinuxWindowsでのプロンプトから入力されたコマンドのコマンドサーチ順位をまとめてみました。


LinuxなどのUNIX系では、プロンプトから入力するコマンドのコマンドサーチ順位は、以下のようになっています。

  1. コマンドをパス(絶対・相対)から指定(外部コマンド)
  2. シェルの組み込みコマンドの指定(内部コマンド)
  3. 環境変数PATHをコマンドサーチパスでの指定(外部コマンド)

尚、外部コマンドはwhichコマンドで確認し、内部コマンドはtypeコマンドで確認ができます。

$ type echo
echo is a shell builtin

$ which echo
/usr/bin/echo

ちなみに、echoコマンドは昔は外部コマンドで、今は内部コマンドになっているようです。
つまり、パス指定をしなければ、echoコマンドは内部コマンドが優先される。


Windows系では、以下のようになっています。

  1. コマンドをパス(絶対・相対)から指定(外部コマンド)
  2. シェルの組み込みコマンドの指定(内部コマンドcmd.exe)
  3. カレントディレクトリにあるコマンドの指定(外部コマンド)
  4. 環境変数PATHをコマンドサーチパスでの指定(外部コマンド)


UNIX系との大きな違いは、Windows系ではカレントディレクトリにあるコマンドが、環境変数PATHより優先されることですね。
UNIX系では、カレントディレクトリでさえも、環境変数PATHに入っていないとなりません。


また、Windows系では拡張子なしでコマンド起動ができます。同名のコマンドで拡張子が異なる場合のコマンドは、以下のような優先順になっています。

  1. .COM
  2. .EXE
  3. .BAT

あと、優先順は調べきっていないのですが、以下の種類のファイルも拡張子無しで実行ができますね。

  • .js
  • .vbs
  • .wsf


拡張子について、以下のように、otnさんから教えていただきました。

Windows拡張子については、echo %PATHEXT% 参照。もちろん追加も出来ます

また、コマンドでなく、APからコールされる標準のDLL検索パスは以下のようです。

  1. アプリケーション(EXE、すなわちホストプロセス)のあるディレクトリ
  2. システムディレクトリ。GetSystemDirectory API で取得できるディレクトリ
  3. 16bit 版のシステムディレクトリ(互換性に起因するもの。64bitOSだとたぶん使われないと思いますが正直不明w)
  4. Windows ディテクトリ。GetWindowsDirectory API で取得できるディテクトリ
  5. カレントディテクトリ
  6. PATH 環境変数に指定されているフォルダ(SafeDllSearchMode を操作すると除外可能)
  7. レジストリの、App Paths キーで指定されている特別なフォルダ(インストーラで設定されます)
http://blogs.wankuma.com/tocchann/archive/2008/03/14/127679.aspx