module Shell: Shell
module Ansi:sig
..end
module Process:sig
..end
type'a
with_process_flags =?timeout:Core.Std.Time.Span.t option ->
?working_dir:string -> ?verbose:bool -> ?echo:bool -> ?input:string -> 'a
timeout
: the command will raise Failed_command
if the program doesn't
do any IO for this period of timeworking_dir
: run the command in this directoryverbose
: prints the output of the commandecho
: print out the command before running itinput
: a string to pipe through the program's standard intype'a
with_run_flags =(?expect:int list -> 'a) with_process_flags
with_process_flags
.
expect
: an int list of valid return codes. default value is [0]
, if
the return code of the dispatched is not in this list we will blowup with
Process.Failure
In all the functions below the command is specified with two arguments the first one is string representing the process to run the second one is the list of arguments it takes.
Although the arguments do not need to be escaped there is still a risk that they might be interpreted as flags when they aren't. Most basic unix utilities provide the ability to pass arguments after "--" to avoid this.
Usage example:
let patch = run_full ~expect:[0;1] "diff" ["-u";"--";file1;file2]
type'a
cmd =string -> string list -> 'a
val run : unit cmd with_run_flags
val run_lines : string list cmd with_run_flags
In some cases, the newline should not be stripped (e.g., "cat" will not
"add" a newline). If you care, use run_full
for the entire buffer.
val run_one : string cmd with_run_flags
val run_full : string cmd with_run_flags
run_lines
.All these function take a format (like printf) and run it through the shell.
Usage example:
sh "cp -- %s %s" (Filename.quote file1) (Filename.quote file2)
In general it is recommended to avoid using those too much and to prefer the
run* family of function instead because it avoids pitfall like escaping
issues and is much more straightforward to think about.
type('a, 'b)
sh_cmd =('a, unit, string, 'b) Pervasives.format4 -> 'a
val sh : ('a, unit) sh_cmd with_run_flags
val sh_lines : ('a, string list) sh_cmd with_run_flags
val sh_one : ('a, string) sh_cmd with_run_flags
val sh_full : ('a, string) sh_cmd with_run_flags
Usage example:
if Shell.test "diff" ["-q";"--";file1;file2] then
Printf.printf "Files %S and %S are the same\n%!" file1 file2;
type'a
with_test_flags =(?true_v:int list -> ?false_v:int list -> 'a) with_process_flags
true
if the exit code is in true_v
.false
if the exit code is in false_v
and not in true_v
.Process.Failure
otherwisetrue_v
: default value [0]
false_v
: default_value [1]
val test : bool cmd with_test_flags
val sh_test : ('a, bool) sh_cmd with_test_flags
val mkdir_p : ?perm:Core.Std.Unix.file_perm -> string -> unit
val ls : string -> string list
val quote : string -> string
val is_directory : ?unlink:bool -> string -> bool
val is_file : ?unlink:bool -> string -> bool
val file_kind : string -> Core.Std.Unix.file_kind
val file_exists : string -> bool
val copy_file : ?overwrite:bool ->
?perm:Core.Std.Unix.file_perm -> src:string -> dst:string -> unit
val rm : string -> unit
val cp : string -> string -> unit
val whoami : ?real:bool -> unit -> string
val home : unit -> string
val get_group_names : unit -> string list
val in_group : string -> bool
val hostname : unit -> string
val which : string -> string option
val get_editor : unit -> string option
val mkdir_p : ?perm:Core.Std.Unix.file_perm -> string -> unit
val ls : string -> string list
val quote : string -> string
val (^/) : string -> string -> string
val ssh : user:string -> host:string -> string -> unit
ssh user host command
run command via sshval scp : ?recurse:bool -> user:string -> host:string -> string -> string -> unit
scp user host from to
copy local file from to toval echo : ('a, Pervasives.out_channel, unit) Pervasives.format -> 'a
val warnf : ('a, unit, string, unit) Pervasives.format4 -> 'a
val email : string -> string Core.Std.List.container -> string -> string -> unit