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.