2017-01-17 14 views
2

実行ファイル(foo)が有効であるかどうかを引数で調べる前にチェックしたいとします。これを行うための様々な手段がコマンドラインから利用可能である(例えば、$> hash foo)。実行可能ファイルが有効かどうかを確認する

私の知る限り、OCamlのSysUnixも、このような機能を提供していません。

unix実行ファイルを示す文字列を受け入れ、引数が実行可能かどうかを示すboolを返すメカニズムを慣習的に定義する方法はありますか?

答えて

2

この目的で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コマンドがあり、多くのコマンドラインオプションのいずれかを使用することができます。

2

fileを使用しているcodeforesterの回答に加えて、fileの出力に効果的にアクセスできるlibmagicへのバインディングもあります。オペアンプでmagicとして入手可能なhttps://github.com/Chris00/ocaml-magicを参照してください。

+0

「シェルアウト」とはどういう意味ですか? –

+0

シェル経由で外部プログラムを呼び出す(例bash、cmd.exeなど) – hcarty

2

ファイルが実行可能であるかどうかを確認するために、私は、ファイルのパーミッションを使用します - あなたはそれらを次のように取得することができます。xフラグが設定されていることを示す

let getstat f = (Unix.stat (Filename.basename f)).Unix.st_perm;; 
Printf.printf "%d\n" (getstat ".bashrc");; 
> 644 

を。

4

ファイルが実行可能かどうかを確認する機能は、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() 
関連する問題