sig
  type ('a, 'b, 'c) command constraint 'a = [< `Input | `No_input ]
    constraint 'b = [< `No_output | `Output ]
    constraint 'c = [< `Error | `No_error ]
  type configuration = {
    pipe : string;
    redirect_output : string;
    redirect_append_output : string;
    redirect_error : string;
    redirect_append_error : string;
  }
  val bash : Shell.configuration
  val set_configuration : Shell.configuration -> unit
  val read_lines : string -> string list
  val write_lines : string list -> string -> unit
  val command :
    string ->
    ([< `Input | `No_input ], [< `No_output | `Output ],
     [< `Error | `No_error ])
    Shell.command
  val coerce :
    ([< `Input | `No_input ], [< `No_output | `Output ],
     [< `Error | `No_error ])
    Shell.command ->
    ([< `Input | `No_input ], [< `No_output | `Output ],
     [< `Error | `No_error ])
    Shell.command
  val ignore :
    ([< `Input | `No_input ] as 'a, [< `No_output | `Output ],
     [< `Error | `No_error ])
    Shell.command -> ('a, [ `No_output ], [ `No_error ]) Shell.command
  val run :
    ([< `Input | `No_input ], [< `No_output | `Output ],
     [< `Error | `No_error ])
    Shell.command -> int
  val run_list :
    ([< `Input | `No_input ], [< `No_output | `Output ],
     [< `Error | `No_error ])
    Shell.command list -> int
  val file_exists : string -> bool
  val is_directory : string -> bool
  val getenv : string -> string
  val files : string -> string list
  val files_with_filter : (string -> bool) -> string -> string list
  val files_with_suffix : string -> string -> string list
  val current_dir_name : string
  val parent_dir_name : string
  val is_relative : string -> bool
  val is_implicit : string -> bool
  val check_suffix : string -> string -> bool
  val chop_suffix : string -> string -> string
  val chop_extension : string -> string
  val basename : string -> string
  val dirname : string -> string
  val concatname : string -> string -> string
  val temp_file : ?temp_dir:string -> string -> string -> string
  val quote : string -> string
  val pwd : unit -> string
  val cd : string -> unit
  val pushd : string -> unit
  val popd : unit -> string
  val exit :
    int -> ([ `No_input ], [ `No_output ], [ `No_error ]) Shell.command
  val pwdir :
    unit -> ([ `No_input ], [ `Output ], [ `No_error ]) Shell.command
  val chdir :
    string -> ([ `No_input ], [ `No_output ], [ `Error ]) Shell.command
  val mkdir :
    ?options:string list ->
    string -> ([ `No_input ], [ `No_output ], [ `Error ]) Shell.command
  val rmdir :
    ?options:string list ->
    string -> ([ `No_input ], [ `No_output ], [ `Error ]) Shell.command
  val ls :
    ?options:string list ->
    string list -> ([ `No_input ], [ `Output ], [ `Error ]) Shell.command
  val cp :
    ?options:string list ->
    string list ->
    string -> ([ `No_input ], [ `No_output ], [ `Error ]) Shell.command
  val rm :
    ?options:string list ->
    string list -> ([ `No_input ], [ `No_output ], [ `Error ]) Shell.command
  val mv :
    ?options:string list ->
    string list ->
    string -> ([ `No_input ], [ `No_output ], [ `Error ]) Shell.command
  val touch :
    ?options:string list ->
    string list -> ([ `No_input ], [ `No_output ], [ `Error ]) Shell.command
  val cat :
    ?options:string list ->
    string list -> ([ `No_input ], [ `Output ], [ `Error ]) Shell.command
  val echo :
    ?options:string list ->
    string -> ([ `No_input ], [ `Output ], [ `Error ]) Shell.command
  val diff :
    ?options:string list ->
    string ->
    string -> ([ `No_input ], [ `Output ], [ `Error ]) Shell.command
  val grep :
    ?options:string list ->
    string -> ([ `Input ], [ `Output ], [ `Error ]) Shell.command
  val grep_files :
    ?options:string list ->
    string ->
    string list -> ([ `No_input ], [ `Output ], [ `Error ]) Shell.command
  val sed :
    ?options:string list ->
    string -> ([ `Input ], [ `Output ], [ `Error ]) Shell.command
  val sort :
    ?options:string list ->
    string list -> ([ `Input ], [ `Output ], [ `Error ]) Shell.command
  val cut :
    ?options:string list ->
    string list -> ([ `Input ], [ `Output ], [ `Error ]) Shell.command
  val sleep :
    int -> ([ `No_input ], [ `No_output ], [ `No_error ]) Shell.command
  val pipe :
    ([< `Input | `No_input ] as 'a, [ `Output ], [< `Error | `No_error ])
    Shell.command ->
    ([ `Input ], [< `No_output | `Output ] as 'b,
     [< `Error | `No_error ] as 'c)
    Shell.command -> ('a, 'b, 'c) Shell.command
  val ( |> ) :
    ([< `Input | `No_input ] as 'a, [ `Output ], [< `Error | `No_error ])
    Shell.command ->
    ([ `Input ], [< `No_output | `Output ] as 'b,
     [< `Error | `No_error ] as 'c)
    Shell.command -> ('a, 'b, 'c) Shell.command
  val redirect_output :
    ([< `Input | `No_input ] as 'a, [ `Output ],
     [< `Error | `No_error ] as 'b)
    Shell.command -> string -> ('a, [ `No_output ], 'b) Shell.command
  val ( >> ) :
    ([< `Input | `No_input ] as 'a, [ `Output ],
     [< `Error | `No_error ] as 'b)
    Shell.command -> string -> ('a, [ `No_output ], 'b) Shell.command
  val redirect_append :
    ([< `Input | `No_input ] as 'a, [ `Output ],
     [< `Error | `No_error ] as 'b)
    Shell.command -> string -> ('a, [ `No_output ], 'b) Shell.command
  val ( >>> ) :
    ([< `Input | `No_input ] as 'a, [ `Output ],
     [< `Error | `No_error ] as 'b)
    Shell.command -> string -> ('a, [ `No_output ], 'b) Shell.command
  val redirect_error :
    ([< `Input | `No_input ] as 'a, [< `No_output | `Output ] as 'b,
     [ `Error ])
    Shell.command -> string -> ('a, 'b, [ `No_error ]) Shell.command
  val ( >>>> ) :
    ([< `Input | `No_input ] as 'a, [< `No_output | `Output ] as 'b,
     [ `Error ])
    Shell.command -> string -> ('a, 'b, [ `No_error ]) Shell.command
  val redirect_append_error :
    ([< `Input | `No_input ] as 'a, [< `No_output | `Output ] as 'b,
     [ `Error ])
    Shell.command -> string -> ('a, 'b, [ `No_error ]) Shell.command
  val ( >>>>> ) :
    ([< `Input | `No_input ] as 'a, [< `No_output | `Output ] as 'b,
     [ `Error ])
    Shell.command -> string -> ('a, 'b, [ `No_error ]) Shell.command
end