実行ファイル(foo
)が有効であるかどうかを引数で調べる前にチェックしたいとします。これを行うための様々な手段がコマンドラインから利用可能である(例えば、$> hash foo
)。実行可能ファイルが有効かどうかを確認する
私の知る限り、OCamlのSys
もUnix
も、このような機能を提供していません。
unix実行ファイルを示す文字列を受け入れ、引数が実行可能かどうかを示すboolを返すメカニズムを慣習的に定義する方法はありますか?
実行ファイル(foo
)が有効であるかどうかを引数で調べる前にチェックしたいとします。これを行うための様々な手段がコマンドラインから利用可能である(例えば、$> hash foo
)。実行可能ファイルが有効かどうかを確認する
私の知る限り、OCamlのSys
もUnix
も、このような機能を提供していません。
unix実行ファイルを示す文字列を受け入れ、引数が実行可能かどうかを示すboolを返すメカニズムを慣習的に定義する方法はありますか?
この目的でfile
コマンドを使用できます。実行可能ファイルのfile
戻り、この:
file /bin/ls
output => ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x37cdd635587f519989044055623abff939002027, stripped
あなたは出力を解析またはfile
コマンドがあり、多くのコマンドラインオプションのいずれかを使用することができます。
file
を使用しているcodeforesterの回答に加えて、file
の出力に効果的にアクセスできるlibmagicへのバインディングもあります。オペアンプでmagic
として入手可能なhttps://github.com/Chris00/ocaml-magicを参照してください。
ファイルが実行可能であるかどうかを確認するために、私は、ファイルのパーミッションを使用します - あなたはそれらを次のように取得することができます。xフラグが設定されていることを示す
let getstat f = (Unix.stat (Filename.basename f)).Unix.st_perm;; Printf.printf "%d\n" (getstat ".bashrc");; > 644
を。
ファイルが実行可能かどうかを確認する機能は、Unix.access
です。パスをさらに検索する場合は、追加の足場が必要です(例:
let syspath = String.split_on_char ':' (Sys.getenv "PATH")
let check_executable path =
let open Unix in
try
access path [ X_OK ]; Some path
with _ -> None
let starts_with s prefix =
let open String in
let plen = length prefix in
length s >= plen && sub s 0 plen = prefix
let search_path name =
if starts_with name "/" || starts_with name "./" || starts_with name "../"
then
check_executable name
else
List.fold_left (fun acc dir ->
match acc with
| Some file -> Some file
| None ->
check_executable (Filename.concat dir name)
) None syspath
let main() =
Array.iter (fun arg ->
match search_path arg with
| None -> Printf.printf "%s (Not found)\n" arg
| Some file -> Printf.printf "%s -> %s\n" arg file)
Array.(sub Sys.argv 1 (length Sys.argv - 1))
let() = main()
「シェルアウト」とはどういう意味ですか? –
シェル経由で外部プログラムを呼び出す(例bash、cmd.exeなど) – hcarty