sig
  type status =
      [ `Exited of int
      | `Signaled of Core.Std.Signal.t
      | `Timeout of Core.Std.Time.Span.t ]
  type t
  type result = {
    command : Shell.Process.t;
    status : Shell.Process.status;
    stdout : string;
    stderr : string;
  }
  exception Failed of Shell.Process.result
  val to_string : Shell.Process.t -> string
  val status_to_string : Shell.Process.status -> string
  val set_defaults :
    ?timeout:Core.Std.Time.Span.t option ->
    ?verbose:bool -> ?echo:bool -> unit -> unit
  val format_failed : Shell.Process.result -> string
  val cmd : string -> string list -> Shell.Process.t
  val shell : string -> Shell.Process.t
  val remote :
    ?ssh_options:string list ->
    ?quote_args:bool ->
    ?user:string -> host:string -> Shell.Process.t -> Shell.Process.t
  type 'a reader
  val content : string Shell.Process.reader
  val discard : unit Shell.Process.reader
  val lines : ?eol:char -> unit -> string list Shell.Process.reader
  val head : ?eol:char -> unit -> string option Shell.Process.reader
  exception Empty_head
  val head_exn : ?eol:char -> unit -> string Shell.Process.reader
  val callback :
    add:(string -> int -> unit) ->
    flush:(unit -> unit) -> unit Shell.Process.reader
  val run :
    (Shell.Process.t -> 'Shell.Process.reader -> 'a) Shell.with_run_flags
  val run_k :
    ((Shell.Process.t -> 'Shell.Process.reader -> 'a) -> 'b) ->
    'Shell.with_run_flags
  val test : (Shell.Process.t -> bool) Shell.with_test_flags
  val test_k : ((Shell.Process.t -> bool) -> 'a) -> 'Shell.with_test_flags
end