let run ?(trace:bool=false) ?(input:content="") (cmd:command) : string * Unix.process_status =
let script = temp_file ~perm:0o755 ~prefix:"script-" ~suffix:".sh" ~content:cmd () in
let output = temp_file ~perm:0o644 ~prefix:"script-" ~suffix:".output" () in
let (input_option,input_file) = if (input="")
then ("","")
else
let name=(temp_file ~perm:0o644 ~prefix:"script-" ~suffix:".input" ()) in
begin
put name input;
((" <"^name),name)
end
in
let code = Unix.system(script^" >"^output^input_option) in
let str = (cat output) in
begin
if trace then begin
prerr_endline ("\n======> INPUT FILE: <<EOF\n"^input^"EOF");
prerr_endline ("\n======> SCRIPT CONTENT: <<EOF\n"^cmd^"EOF");
prerr_endline ("\n======> OUTPUT: <<EOF\n"^str^"EOF");
()
end;
Unix.unlink script;
Unix.unlink output;
if (not (input="")) then (Unix.unlink input_file);
(str,code)
end