Deno.statの モードの 読み方
(Updated more than a year ago)
#要約
Deno.stat().modeは 10 進数表記の実行権限を返してくる- これは C の
stat()が返してくるものと同じ
- これは C の
#以下、駄文
bashrc や zshrc、config.fish を toml から生成するプログラムを書いている。
書いている最中に if executable("command") then ... みたいなことを Deno 単体でやりたくなったので Deno.stat 使って実装しようとした。
unix 的には "command" が実行できるということは以下が満たされているときである。
$PATH.split(":").map((e) => e + "/command")が存在- そのファイルに実行権限がついている
ファイルの mode は Deno.stat で取得できるが、0644 みたいな表現ではなかったので調べた結果をまとめる。
#結果
Deno.statSync().modeで得られる数値は nodejs のfs.stat().modeで得られるものと同じmodeの値は C のstat()で得られる fieldst_modeの値を 10 進数表記したものst_modeの下 4 桁が0644にあたる。
よって、あるコマンドが実行可能かどうかは以下の関数で実現できる。
function executable(command: string): boolean {
const pathDirs = (Deno.env.get("PATH") ?? "").split(":");
return pathDirs.some((dir: string) => {
try {
const mode = Deno.statSync(`${dir}/${command}`).mode;
if (mode === null) {
return false;
}
return (mode & parseInt("100", 8)) === parseInt("100", 8);
} catch (_) {
return false;
}
});
}
console.log(executable("deno"));
// true
とりあえず、カレントユーザが実行できるかどうかだけみたいので 100 とビット演算をしてそのフラグが立ってるかどうかを見ている。