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 ではない、と判断していると考えられる。