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("bash -c " ^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