function
Library: Process execution (OMPROCESS)
Import : omprocess.xmd |
Returns: the return code generated by executing the specified process |
export integer function execute value command-line-type command-line in-directory value string initial-directory optional stdin value string source stdin optional stdout value string sink stdout optional stderr value string sink stderr optional environment read-only string environment optional
Argument definitions
The execute
function launches the execution of a program external to OmniMark, using the provided
command line.
The command-line is provided with either of the functions command-line
or executable-name
. Examples appear below.
The program is fed its input from the stdin argument; the stdout
argument can be used to process the output generated by the program. Similarly, the stderr
argument can be used to process the error stream from the program. If stdin is not specified,
it defaults to an empty string, whereas if either or both of stdout and stderr
are not specified, they default to
#suppress
.
The environment shelf is used to specify a set of environment variables that are provided to
the process when it is launched. The value of each item on the environment shelf should have
the form
NAME=VALUEwhere
VALUE
may be a zero-length string. The shelf item keys are not used,
and need not be set to anything. On both Unix and Windows platforms, the ENVIRONMENT shelf represents the entire
environment variable space of the process: its items are not merged with any pre-existing environment variables.
In the case where any pre-existing environment variables should be preserved, the following procedure should be
followed:
import "omutil.xmd" prefixed by util. process local string environment variable repeat over util.environment as e set new environment to key of e || "=" || e again ; Add any additional environment variables.
Following this, the local shelf environment will contain the appropriately-merged set of
environment variables, and can be passed to the execute
function. If the environment
argument is unspecified, the environment of the OmniMark program is passed on to the program being launched.
When the execute
function terminates, its value is the return code provided by the execution of
the program.
The examples that follow centre around using OMPROCESS to launch the Unix tar
utility. Given a
list of filenames in a file called list.txt
, a typical invocation of the tar
utility
might resemble
tar -zcf results.tar.gz [filenames]where
[filenames]
is the contents of the file list.txt
, and where results.tar.gz
is the name of the resultant archive. This invocation can be specified directly in
OMPROCESS using the command-line
function:
import "omprocess.xmd" unprefixed process void execute command-line ("tar -zcf results.tar.gz " || file "list.txt")Here, the
file
operator is used to expand the file list.txt
and append it to the
leading part of the command line. (The parentheses are needed due to the precedence of heralded arguments in
OmniMark.)
The tar
utility can take a list of filenames by using its -T
command-line option:
tar -zcf results.tar.gz -T list.txtThis invocation can be mimicked in OMPROCESS directly using
command-line
:
import "omprocess.xmd" unprefixed process void execute command-line "tar -zcf results.tar.gz -T list.txt"Beyond this,
tar
can read the list of filenames from its standard input if the argument to the
-T
command-line option is a lone hyphen (-
)
tar -zcf results.tar.gz -T - < list.txtThis command line is modelled in OMPROCESS as
import "omprocess.xmd" unprefixed process void execute command-line "tar -zcf results.tar.gz -T -" stdin file "list.txt"where the stdin argument to
execute
has been used to feed the contents of the file list.txt
onto the standard input of the tar
utility. However, since the stdin
argument is an arbitrary string source
, its value need not be a static file. In fact, we could use any
OmniMark string source
including using a string source function
to generate the list of filenames
dynamically. Consider the following example, somewhat contrived for brevity:
import "omprocess.xmd" unprefixed define string source function file-list () as output file "list.txt" process void execute command-line "tar -zcf results.tar.gz -T -" stdin file-list ()Finally, the hyphen convention that allows the list of files to be specified on the standard input of the
tar
utility can also be used to specify that the archive should be written to standard output. In
fact, in the somewhat esoteric Unix command line
tar -zcf - -T - < list.txt > results.tar.gzthe
tar
utility will read the list of files from its standard input, and write the archive to
its standard output. Using OMPROCESS, this command line might be written
import "omprocess.xmd" unprefixed process void execute command-line "tar -zcf - -T -" stdin file "list.txt" stdout file "results.tar.gz"In complete symmetry with the example of a dynamically-generated list of filenames given above, the stdout argument can be an arbitrary OmniMark
string sink
. For example, again contrived for
brevity:
import "omprocess.xmd" unprefixed define string source function file-list () as output file "list.txt" define string sink function destination () as set file "results.tar.gz" to #current-input process void execute command-line "tar -zcf - -T -" stdin file-list () stdout destination ()
All of the examples given in the previous section using the command-line
function can be specified
using the executable-name
function. The executable-name
function builds a command line from an
executable name and a string
shelf of arguments, and is useful when finer control over command-line
parsing is desired. This might be the case, for instance, if some arguments on the command line contain
spaces.
The list of filenames in list.txt
can be collected onto a shelf using a straightforward repeat scan
loop:
process local string arguments variable repeat scan #main-input match any ++ => t ("%n" | value-end) set new arguments to t againFor the first, simplistic invocation of the
tar
utility, the arguments -zcf results.tar.gz
are best placed ahead of the list of filenames. This is most easily done by initializing the arguments
shelf to contain them from the start:
process local string arguments variable initial { "-zcf", "results.tar.gz" } ; ...The invocation of the
tar
utility now takes the form
import "omprocess.xmd" unprefixed process local string arguments variable initial { "-zcf", "results.tar.gz" } ; Load the ARGUMENTS shelf with filenames ... void execute executable-name "tar" arguments argumentswhere the
repeat scan
loop has been omitted for brevity. The other invocations follow similarly; for example, the final example from above could be written in its entirety as
import "omprocess.xmd" unprefixed define string source function file-list () as output file "list.txt" define string sink function destination () as set file "results.tar.gz" to #current-input process void execute executable-name "tar" arguments { "-zcf", "-", "-T", "-" } stdin file-list () stdout destination ()
The following exceptions may occur:
OMPROCESS_002
Unable to launch process.
OMPROCESS_003
Process terminated abnormally.
OMPROCESS_004
Directory 'X' is not accessible.
OMPROCESS_005
Unable to change to directory 'X'.
OMPROCESS_006
Unable to create pipe for 'X'.
OMPROCESS_007
Unable to write to child process.
OMPROCESS_008
Unable to read from child process.