Process Utilities
To use the bindings from this module:
(import :std/misc/process)
run-process
(run-process cmd
             [coprocess: read-all-as-string]
             [check-status: #t]
             [environment: #f]
             [directory: #f]
             [stdin-redirection: #t]
             [stdout-redirection: #t]
             [stderr-redirection: #f]
             [pseudo-terminal: #f]
             [show-console: #f]) -> any | error
  cmd                := list of strings, [path . arguments]
  coprocess          := procedure interacting with process
  check-status       := procedure or truth value
  environment        := list of strings, ["VAR=VALUE" ...]
  directory          := dir, working directory
  stdin-redirection  := boolean, standard input redirection
  stdout-redirection := boolean, standard output redirection
  stderr-redirection := boolean, standard error redirection
  pseudo-terminal    := boolean, terminal or pipes (UNIX)
  show-console       := boolean, show or hide console (Windows)
Synchronously runs cmd in a subprocess, where cmd is expected to be a list consisting of a path to an executable on the filesystem and its arguments.
The following keyword settings are available:
- coprocess: A procedure that specifies how to interact with the process,
which it receives as an argument, and what should be returned from
run-process. Defaults to reading the whole output as a string viastd/misc/ports#read-all-as-string. - check-status: Declares how to handle the exit status of the process upon
termination. If a procedure is provided, then it will be called with the
process' exit status and a list of process creation arguments. If
check-status is 
#t, the default, then the exit status is checked and an error is raised in case it differs from0. Lastly, the exit status is simply ignored, when check-status is#f. - environment: Indicates the set of environment variable bindings that the
process receives. Each element of the list is a string of the form
VAR=VALUE, where VAR is the name of the variable and VALUE is its binding. When environment is#f, which is the default, the process inherits the environment variable bindings of the Scheme program. - directory: Sets the working directory of the process. When it's 
#f, the default, then the process uses the value of(current-directory). - stdin-redirection: Indicates how the standard input of the process is
redirected. The default 
#twill redirect the standard input from the process-port (i.e. what is written to the process-port will be available on the standard input).#fwill leave the standard input as-is, which typically results in input coming from the console. - stdout-redirection: Indicates how the standard output of the process is
redirected. The default 
#twill redirect the standard output to the process-port (i.e. all output to standard output can be read from the process-port).#fwill leave the standard output as-is, which typically results in the output going to the console. - stderr-redirection: Indicates how the standard error of the process is
redirected. 
#twill redirect the standard error to the process-port (i.e. all output to standard error can be read from the process-port). The default#fwill leave the standard error as-is, which typically results in error messages being output to the console. - pseudo-terminal: Applies to UNIX. It indicates what type of device will be
bound to the process’ standard input and standard output. 
#twill use a pseudo-terminal device (this is a device that behaves like a tty device even though there is no real terminal or user directly involved). The default#fwill use a pair of pipes. The difference is important for programs which behave differently when they are used interactively, for example shells. - show-console: Applies to Microsoft Windows. It controls whether the
process’ console window will be hidden or visible. The default value of this
setting is 
#f(i.e. hide the console window). 
More information can be found in section 17.7.2 Process devices of the Gambit
manual.
Examples:
> (run-process ["date" "--utc"] coprocess: read-line)
"Tue 21 May 2019 12:22:20 PM UTC"
> (run-process ["/usr/bin/ls"])
"desktop\ndev\ndocuments\ndownloads\nmusic\nnotes\npictures\nvideos\n"
> (import :std/misc/ports)
> (run-process ["ls" "-l"] coprocess: read-all-as-lines)
("drwxr-xr-x.  2 user user  4096 Mar 26 13:26 desktop"
 "drwxr-xr-x.  8 user user  4096 May 13 14:28 dev"
 "drwxr-xr-x. 12 user user 12288 May 19 17:26 documents"
 "drwxr-xr-x.  2 user user  4096 May 20 10:13 downloads"
 "drwxrwxr-x.  8 user user  4096 May  1 15:13 music"
 "drwxr-xr-x.  2 user user  4096 May 21 10:53 notes"
 "drwxr-xr-x.  9 user user  4096 Apr 30 19:08 pictures"
 "drwxrwxr-x.  3 user user 12288 May 21 09:41 videos")
> (def (word-count path)
    (run-process ["wc" path]
                 coprocess: (lambda (process)
                              (with ([l w c] (filter number? (read-all process)))
                                (displayln "lines: " l "\nwords: " w "\nchars: " c)))))
> (word-count "/home/user/dev/scheme/nums.txt")
lines: 5
words: 5
chars: 10
run-process/batch
(run-process/batch cmd) -> void
  cmd := list of strings, [path . arguments]
Runs a batch process with stdin closed, and both stdout and stderr on the
current console. Same as (run-process cmd coprocess: close-output-port stdout-redirection: #f).
Examples:
> (def files ["file1.txt" "file2.txt" "file3.txt"])
> (for-each (lambda (file) (run-process/batch ["touch" file])) files)
> (run-process/batch (append ["zip" "big.zip"] files))
adding: file1.txt (stored 0%)
adding: file2.txt (stored 0%)
adding: file3.txt (stored 0%)