2010-02-06 19 views

Respuesta

14

Quiere Unix.open_process_in, que se describe en la página 388 del manual del sistema OCaml, versión 3.10. pread

+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

Puede usar la biblioteca de terceros Rashell que utiliza Lwt para definir algunas primitivas de alto nivel para leer la salida de los procesos. Estas primitivas, definidos en el módulo Rashell_Command, son:

  • exec_utility para leer la salida de un proceso como una cadena;
  • exec_test para leer solo el estado de salida de un proceso;
  • exec_query para leer la salida de una línea de proceso por la línea como un string Lwt_stream.t
  • exec_filter utilizar un programa externo como una transformación string Lwt_stream.t -> string Lwt_stream.t.

La función command se utiliza para crear contextos de comando en el que se pueden aplicar las primitivas anteriores, tiene 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]. *) 

Así, por ejemplo

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

es un string Lwt.t cuales devuelve la cadena "mordida" (nueva línea eliminada) del comando "uname". Como un segundo ejemplo

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

es una string Lwt_stream.t cuyos elementos son los caminos del archivo encontrado por el comando

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

La biblioteca Rashell define también interfaces para algunos comandos usados ​​comúnmente, y una interfaz agradable para el comando find se define en Rashell_Posix, que por cierto garantiza la portabilidad de POSIX.

Cuestiones relacionadas