MinGW では、 faccessat のシステムコールレベルでは、拡張子のみで実行可能性を判定しているっぽい。

MinGW では、 faccessat (ファイルパーミッションを判定するためのシステムコール) において、ファイルの中身は見ずに、引数ファイルの拡張子だけで実行可能かどうかを返している模様。


NTEmacs において次を実行

(locate-file "awk" '("c:/Dev/PortableGit/bin") '(".exe" "") 0)
; -> found

(locate-file "awk" '("c:/Dev/PortableGit/bin") '(".exe" "") 1)
; -> not found

(locate-file "bash" '("c:/Dev/PortableGit/bin") '(".exe" "") 1)
; -> found


locate-file は、内部的に locate-file-internal を利用している。
locate-file-internal 関数のマニュアルを読む限り、 この C source code は faccessat システムコールを利用する様子。


どうしてこの問題に行き当たったかかというと、

(executable-find COMMAND)

は、内部で locate-file を、 predicate==1 で、実行可能ファイルを検索するため。


上記の awk は、MSYS の bash からだと実行できる。
MSYS/MinGW 上にはパーミッションなどは存在していなくて、bash は、シェルで指定されたコマンドが実行できそうだったら、実行する模様。 (.exe や .bat かの判定をしたのち、 shebang を持つスクリプトなのかどうかを判定し、そのどちらでもなかったら executable ではない、と判断していると考えられる。