File: run.Rd

package info (click to toggle)
r-cran-processx 3.8.6-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,068 kB
  • sloc: ansic: 6,485; sh: 13; makefile: 2
file content (222 lines) | stat: -rw-r--r-- 9,313 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
% Generated by roxygen2: do not edit by hand
% Please edit documentation in R/run.R
\name{run}
\alias{run}
\title{Run external command, and wait until finishes}
\usage{
run(
  command = NULL,
  args = character(),
  error_on_status = TRUE,
  wd = NULL,
  echo_cmd = FALSE,
  echo = FALSE,
  spinner = FALSE,
  timeout = Inf,
  stdout = "|",
  stderr = "|",
  stdout_line_callback = NULL,
  stdout_callback = NULL,
  stderr_line_callback = NULL,
  stderr_callback = NULL,
  stderr_to_stdout = FALSE,
  env = NULL,
  windows_verbatim_args = FALSE,
  windows_hide_window = FALSE,
  encoding = "",
  cleanup_tree = FALSE,
  ...
)
}
\arguments{
\item{command}{Character scalar, the command to run. If you are
running \code{.bat} or \code{.cmd} files on Windows, make sure you read the
'Batch files' section in the \link{process} manual page.}

\item{args}{Character vector, arguments to the command.}

\item{error_on_status}{Whether to throw an error if the command returns
with a non-zero status, or it is interrupted. The error classes are
\code{system_command_status_error} and \code{system_command_timeout_error},
respectively, and both errors have class \code{system_command_error} as
well. See also "Error conditions" below.}

\item{wd}{Working directory of the process. If \code{NULL}, the current
working directory is used.}

\item{echo_cmd}{Whether to print the command to run to the screen.}

\item{echo}{Whether to print the standard output and error
to the screen. Note that the order of the standard output and error
lines are not necessarily correct, as standard output is typically
buffered. If the standard output and/or error is redirected to a
file or they are ignored, then they also not echoed.}

\item{spinner}{Whether to show a reassuring spinner while the process
is running.}

\item{timeout}{Timeout for the process, in seconds, or as a \code{difftime}
object. If it is not finished before this, it will be killed.}

\item{stdout}{What to do with the standard output. By default it
is collected in the result, and you can also use the
\code{stdout_line_callback} and \code{stdout_callback} arguments to pass
callbacks for output. If it is the empty string (\code{""}), then
the child process inherits the standard output stream of the
R process. (If the main R process does not have a standard output
stream, e.g. in RGui on Windows, then an error is thrown.)
If it is \code{NULL}, then standard output is discarded. If it is a string
other than \code{"|"} and \code{""}, then it is taken as a file name and the
output is redirected to this file.}

\item{stderr}{What to do with the standard error. By default it
is collected in the result, and you can also use the
\code{stderr_line_callback} and \code{stderr_callback} arguments to pass
callbacks for output. If it is the empty string (\code{""}), then
the child process inherits the standard error stream of the
R process. (If the main R process does not have a standard error
stream, e.g. in RGui on Windows, then an error is thrown.)
If it is \code{NULL}, then standard error is discarded. If it is a string
other than \code{"|"} and \code{""}, then it is taken as a file name and the
standard error is redirected to this file.}

\item{stdout_line_callback}{\code{NULL}, or a function to call for every
line of the standard output. See \code{stdout_callback} and also more
below.}

\item{stdout_callback}{\code{NULL}, or a function to call for every chunk
of the standard output. A chunk can be as small as a single character.
At most one of \code{stdout_line_callback} and \code{stdout_callback} can be
non-\code{NULL}.}

\item{stderr_line_callback}{\code{NULL}, or a function to call for every
line of the standard error. See \code{stderr_callback} and also more
below.}

\item{stderr_callback}{\code{NULL}, or a function to call for every chunk
of the standard error. A chunk can be as small as a single character.
At most one of \code{stderr_line_callback} and \code{stderr_callback} can be
non-\code{NULL}.}

\item{stderr_to_stdout}{Whether to redirect the standard error to the
standard output. Specifying \code{TRUE} here will keep both in the
standard output, correctly interleaved. However, it is not possible
to deduce where pieces of the output were coming from. If this is
\code{TRUE}, the standard error callbacks  (if any) are never called.}

\item{env}{Environment variables of the child process. If \code{NULL},
the parent's environment is inherited. On Windows, many programs
cannot function correctly if some environment variables are not
set, so we always set \code{HOMEDRIVE}, \code{HOMEPATH}, \code{LOGONSERVER},
\code{PATH}, \code{SYSTEMDRIVE}, \code{SYSTEMROOT}, \code{TEMP}, \code{USERDOMAIN},
\code{USERNAME}, \code{USERPROFILE} and \code{WINDIR}. To append new environment
variables to the ones set in the current process, specify
\code{"current"} in \code{env}, without a name, and the appended ones with
names. The appended ones can overwrite the current ones.}

\item{windows_verbatim_args}{Whether to omit the escaping of the
command and the arguments on windows. Ignored on other platforms.}

\item{windows_hide_window}{Whether to hide the window of the
application on windows. Ignored on other platforms.}

\item{encoding}{The encoding to assume for \code{stdout} and
\code{stderr}. By default the encoding of the current locale is
used. Note that \code{processx} always reencodes the output of
both streams in UTF-8 currently.}

\item{cleanup_tree}{Whether to clean up the child process tree after
the process has finished.}

\item{...}{Extra arguments are passed to \code{process$new()}, see
\link{process}. Note that you cannot pass \code{stout} or \code{stderr} here,
because they are used internally by \code{run()}. You can use the
\code{stdout_callback}, \code{stderr_callback}, etc. arguments to manage
the standard output and error, or the \link{process} class directly
if you need more flexibility.}
}
\value{
A list with components:
\itemize{
\item status The exit status of the process. If this is \code{NA}, then the
process was killed and had no exit status.
\item stdout The standard output of the command, in a character scalar.
\item stderr The standard error of the command, in a character scalar.
\item timeout Whether the process was killed because of a timeout.
}
}
\description{
\code{run} provides an interface similar to \code{\link[base:system]{base::system()}} and
\code{\link[base:system2]{base::system2()}}, but based on the \link{process} class. This allows some
extra features, see below.
}
\details{
\code{run} supports
\itemize{
\item Specifying a timeout for the command. If the specified time has
passed, and the process is still running, it will be killed
(with all its child processes).
\item Calling a callback function for each line or each chunk of the
standard output and/or error. A chunk may contain multiple lines, and
can be as short as a single character.
\item Cleaning up the subprocess, or the whole process tree, before exiting.
}
}
\section{Callbacks}{


Some notes about the callback functions. The first argument of a
callback function is a character scalar (length 1 character), a single
output or error line. The second argument is always the \link{process}
object. You can manipulate this object, for example you can call
\verb{$kill()} on it to terminate it, as a response to a message on the
standard output or error.
}

\section{Error conditions}{


\code{run()} throws error condition objects if the process is interrupted,
timeouts or fails (if \code{error_on_status} is \code{TRUE}):
\itemize{
\item On interrupt, a condition with classes \code{system_command_interrupt},
\code{interrupt}, \code{condition} is signalled. This can be caught with
\code{tryCatch(..., interrupt = ...)}.
\item On timeout, a condition with classes \code{system_command_timeout_error},
\code{system_command_error}, \code{error}, \code{condition} is thrown.
\item On error (if \code{error_on_status} is \code{TRUE}), an error with classes
\code{system_command_status_error}, \code{system_command_error}, \code{error},
\code{condition} is thrown.
}

All of these conditions have the fields:
\itemize{
\item \code{message}: the error message,
\item \code{stderr}: the standard error of the process, or the standard output
of the process if \code{stderr_to_stdout} was \code{TRUE}.
\item \code{call}: the captured call to \code{run()}.
\item \code{echo}: the value of the \code{echo} argument.
\item \code{stderr_to_stdout}: the value of the \code{stderr_to_stdout} argument.
\item \code{status}: the exit status for \code{system_command_status_error} errors.
}
}

\examples{
\dontshow{if (.Platform$OS.type == "unix") (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf}
# This works on Unix systems
run("ls")
system.time(run("sleep", "10", timeout = 1, error_on_status = FALSE))
system.time(
  run(
    "sh", c("-c", "for i in 1 2 3 4 5; do echo $i; sleep 1; done"),
    timeout = 2, error_on_status = FALSE
  )
)
\dontshow{\}) # examplesIf}
\dontshow{if (FALSE) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf}
# This works on Windows systems, if the ping command is available
run("ping", c("-n", "1", "127.0.0.1"))
run("ping", c("-n", "6", "127.0.0.1"), timeout = 1,
    error_on_status = FALSE)
\dontshow{\}) # examplesIf}
}