package shexp
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=01fa41159385c30cc9de233fda13f359fb8ad1b01ed513dd1de8262aa64a3d35
md5=d756263aa2b95303edba19af36c0feea
doc/shexp.process/Shexp_process/Std/Process/index.html
Module Std.Process
Source
The Shexp process monad
An 'a t
value represent a process pipeline description, that can be evaluated using eval
into a value of type 'a
. Note that creating an 'a t
value has no effect. Effects are only performed when calling eval
.
Evaluate the given process in the given environment.
If context
is not specified, a temporary one is created. If you are calling eval
many times, then creating a context and reusing it is more efficient.
shexp_process allows one to plug a debugger in the evaluator. Logged
and Traced
are essentially two non-interactive debuggers.
Basic processes
Classic monad operations. Note that because shexp_process uses threads under the hood, you should be careful about using global mutable data structures. To communicate values between concurrent processes, use the sync
function.
Create a process that fails with the given exception. Evaluation of this process will raise this exception.
fork a b
represents two processes that are executed concurrently. The resulting process will block until both a
and b
have finished and will return both of their results.
This is essentially the same as forking a system process: both process can independently change the current working directory, change their standard out, etc...
Regarding errors, if the evaluation of both processes fail, then only one the exceptions will be kept. It is not specified which one. You should use Traced
to get a full trace and see what exceptions are raised and where.
fork_all ps
represents List.length ps
processes executed concurrently. fork_all
generalizes fork
from pairs of elements to lists of elements.
A slightly more efficient version of map (fork_all ps) ~f:(fun _ -> ())
protect ~finally t
protects against execution errors. finally
is always executed, even if the evaluation of t
raises.
Capture exceptions into the process monad. You can use this if the argument of protect
is the result of a function call.
For instance in the following code finally
wouldn't be executed:
let f () = raise Not_found
protect ~finally (f ())
You can write instead:
protect ~finally (reify_exn f ())
Running commands
Run an external program. This will fail if the external program does not exists, is signaled or exit with a non-zero exit code.
Run an external program and return its exit code. This will fail if the external program is signaled.
Run an external program and return its exit status.
Run an external program, returns true
if its exit code is part of true_v
and false
if it is part of false_v
.
Same functions as the 'run' ones above, but take a string list instead. This way, the first element and the others are treated in a homogeneous way. It can ease prepending commands in specific circumstances, e.g. if profile then call ("time" :: command) else call command
E.g. call ["grep"; "-i"; pattern; filename]
is equivalent to run "grep" ["-i"; pattern; filename]
Start an external program but do not wait for its termination. If you never call wait
on the result, the process will become a zombie after it terminates.
Wait for a background command to terminate and return its exit status.
Unix environment
Return the value associated to the given environment variable.
set_env var value k
represents the process k
evaluated in a context where the envornment variable var
is set to value
.
set_env var value k
represents the process k
evaluated in a context where the environment variable var
is unset.
Current working directory
Return the current working directory. Note that there is no guarantee that this directory exists. For instance if a component in this path has is renamed during the evaluation of the process, then this will be a dangling directory.
chdir dir k
represents the process k
evaluated in a context where the current working directory is changed to dir
.
IO
Output a string on one of the standard io. ~n:()
suppresses the newline output at the end.
Fold over lines in the input. f
is given the line with the end of line. Both "\r\n"
and "\n"
are treated as end of lines.
Fold over chunks separated by sep
in the input. This can be used in conjunction with commands that support ending entries in the output with a '\000'
such as find -print0
.
Pipes
pipe ~connect:(aios, bio) a b
is a process obtain by connecting the aios
of a
to the bio
of b
. a
and b
are evaluated in parallel (as with fork
).
(aio, bio)
defaults to ([Stdout], Stdin)
.
pipe_pair a b
is a the same as pipe
but returns the results of both a
and b
.
capture ios t = pipe_both ~connect:(ios, Stdin) read_all
capture_unit ios t = pipe ~connect:(ios, Stdin) read_all
Redirections
val redirect :
Std_io.t list ->
?perm:int ->
flags:Unix.open_flag list ->
string ->
'a t ->
'a t
redirect ios ?perm ~flags filename t
redirects the following ios to a file in t
. perm
and flags
are passed the same as for Unix.openfile
.
Replace the given standard io by the given one. For instance to redirect stdout to stderr: replace_io ~stdout:Stderr t
Temporary files & directory
set_temp_dir dir k
represents the process k
evaluated in a context where the current temporary directory is set to dir
.
with_temp_file ~prefix ~suffix f
is a process that creates a temporary file and passes it to f
. The file is created inside the temporary directory.
When the process returned by f
finishes, the file is removed.
Same as with_temp_file
but creates a directory. The directory and its contents are deleted when the process finishes.
FS operations
Misc
Synchronisation
Misc
Open this module when using ppx_let