2010-02-06 14 views

risposta

14

Si desidera Unix.open_process_in, che è descritto a pagina 388 del manuale di sistema OCaml, versione 3.10.

+3

http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html#VALopen_process_in – newacct

4
let process_output_to_list2 = fun command -> 
    let chan = Unix.open_process_in command in 
    let res = ref ([] : string list) in 
    let rec process_otl_aux() = 
    let e = input_line chan in 
    res := e::!res; 
    process_otl_aux() in 
    try process_otl_aux() 
    with End_of_file -> 
    let stat = Unix.close_process_in chan in (List.rev !res,stat) 
let cmd_to_list command = 
    let (l,_) = process_output_to_list2 command in l 
2

È possibile utilizzare la libreria di terze parti Rashell che utilizza Lwt per definire alcune primitive di alto livello per leggere l'output dai processi. Queste primitive, definite nel modulo Rashell_Command, sono:

  • exec_utility per leggere l'output di un processo come una stringa;
  • exec_test per leggere solo lo stato di uscita di un processo;
  • exec_query per leggere l'uscita di una linea di processo per riga come string Lwt_stream.t
  • exec_filter utilizzare un programma esterno come trasformazione string Lwt_stream.t -> string Lwt_stream.t.

La funzione command viene utilizzata per creare contesti di comando su cui possono essere applicati i primitivi precedenti, ha la firma:

val command : ?workdir:string -> ?env:string array -> string * (string array) -> t 
(** [command (program, argv)] prepare a command description with the 
    given [program] and argument vector [argv]. *) 

Così, per esempio

Rashell_Command.(exec_utility ~chomp:true (command("", [| "uname" |]))) 

è un string Lwt.t che restituisce la stringa "Chomped" (nuova riga rimossa) del comando "uname". Come secondo esempio

Rashell_Command.(exec_query (command("", [| "find"; "/home/user"; "-type"; "f"; "-name"; "*.orig" |]))) 

è un string Lwt_stream.t cui elementi sono i percorsi del file trovato dal comando

find /home/user -type f -name '*.orig' 

La libreria Rashell definisce anche interfacce per alcuni comandi di uso comune, e una bella interfaccia per il comando find è definito in Rashell_Posix - che, a proposito, garantisce la portabilità POSIX.

Problemi correlati