sig
  type command
  type pipeline = {
    input : string list;
    output : string list;
    commands : Pipeline.command list;
  }
  val command :
    ?stdin:string -> ?stdout:string -> string list -> Pipeline.command
  val run :
    ?log:Pervasives.out_channel ->
    ?before:(unit -> unit) ->
    ?after:(unit -> unit) ->
    ?input:(string * string) list ->
    ?output:(string * string) list -> Pipeline.pipeline -> int
  val remove : ?log:Pervasives.out_channel -> string -> unit
  val copy_file :
    ?log:Pervasives.out_channel ->
    ?head:string -> ?tail:string -> ?force:bool -> string -> string -> unit
  val run_command : ?log:Pervasives.out_channel -> Pipeline.command -> int
end