system {base} | R Documentation |
system
invokes the OS command specified by command
.
system(command, intern = FALSE, ignore.stdout = FALSE, ignore.stderr = FALSE, wait = TRUE, input = NULL, show.output.on.console = TRUE, minimized = FALSE, invisible = TRUE)
command |
the system command to be invoked, as a character string. |
intern |
a logical (not NA ) which indicates whether to
capture the output of the command as an R character vector. |
ignore.stdout, ignore.stderr |
a logical (not NA )
indicating whether messages written to ‘stdout’ or
‘stderr’ should be ignored. |
wait |
a logical (not NA ) indicating whether the R
interpreter should wait for the command to finish, or run it
asynchronously. This will be ignored (and the interpreter will
always wait) if intern = TRUE . |
input |
if a character vector is supplied, this is copied one
string per line to a temporary file, and the standard input of
command is redirected to the file. |
show.output.on.console, minimized, invisible |
arguments that are accepted on Windows but ignored on this platform, with a warning. |
command
is parsed as a command plus arguments separated by spaces.
So if the path to the command (or an argument) contains
spaces, it must be quoted e.g. by shQuote
.
How the command is run differs by platform: Unix-alikes use a shell
(normally ‘/bin/sh’), and Windows executes the command directly.
command
can be anything the shell regards as executable,
including shell scripts.
If intern
is TRUE
then popen
is used to invoke the
command and the output collected, line by line, into an R
character
vector. If intern
is FALSE
then
the C function system
is used to invoke the command.
The ordering of arguments after the first two has changed from time to time: it is recommended to name all arguments after the first.
There are many pitfalls in using system
to ascertain if a
command can be run — Sys.which
is more suitable.
If intern = TRUE
, a character vector giving the output of the
command, one line per character string. (Output lines of more than
8095 bytes will be split.) If the command could not be run an R
error is generated.
If intern = FALSE
, the return value is an error code (0
for success), given the invisible attribute (so needs to be printed
explicitly). If the command could not be run for any reason, the
value is 127
. Otherwise if wait = TRUE
the value is the
exit status returned by the command, and if wait = FALSE
it is
0
(the conventional success value).
For command-line R, error messages written to ‘stderr’ will be
sent to the terminal unless ignore.stderr = TRUE
. They can be
captured (in the most likely shells) by
system("some command 2>&1", intern=TRUE)
For GUIs, what happens to output sent to ‘stdout’ or
‘stderr’ if intern = FALSE
is interface-specific, and it
is unsafe to assume that such messages will appear on a GUI console
(they do on the Mac OS X console, but not on some others).
How processes are launched differs fundamentally between Windows and
Unix-alike operating systems, as do the higher-level OS functions on
which this R function is built. So it should not be surprising that
there are many differences between OSes in how system
behaves.
For the benefit of programmers, the more important ones are summarized
in this section.
system
does is to launch a shell which then runs
command
. On Windows the command is run directly – use
shell
for an interface which runs comamnd
via a
shell (by default the Windows shell cmd.exe
).
This means that it cannot be assumed that redirection or piping will
work in system
(redirection sometimes does, but we have seen
cases where it stopped working after a Windows security patch), and
shell
must be used on Windows.
command
differ, but
shQuote
is a portable interface.
show.output.on.console
, minimized
,
invisible
only do something on Windows (and are most relevant
to a GUI interface there).
wait
is implemented by appending &
to the command: this
is shell-dependent, but required by POSIX and so widely supported.
.Platform
for platform-specific variables.
pipe
to set up a pipe connection.
# list all files in the current directory using the -F flag ## Not run: system("ls -F") # t1 is a character vector, each one # representing a separate line of output from who # (if the platform has who) t1 <- try(system("who", intern = TRUE)) try(system("ls fizzlipuzzli", intern = TRUE, ignore.stderr = TRUE)) # zero-length result since file does not exist, and will give warning.