system
位于 base
包(package)。 说明
system
调用command
指定的操作系统命令。
用法
system(command, intern = FALSE,
ignore.stdout = FALSE, ignore.stderr = FALSE,
wait = TRUE, input = NULL, show.output.on.console = TRUE,
minimized = FALSE, invisible = TRUE, timeout = 0,
receive.console.signals = wait)
参数
command |
要调用的系统命令,作为字符串。 |
intern |
一个逻辑的(不是 |
ignore.stdout , ignore.stderr |
一个逻辑的(不是 |
wait |
一个逻辑的(不是 |
input |
如果提供了字符向量,则每行将一个字符串复制到临时文件,并且 |
timeout |
超时(以秒为单位),如果为 0,则忽略。这是在单独进程中运行 |
receive.console.signals |
一个逻辑的(不是 |
show.output.on.console , minimized , invisible |
在 Windows 上接受但在此平台上忽略的参数,并带有警告。 |
细节
多年来,这个接口变得相当复杂:请参阅system2
以获得更便携、更灵活的接口,推荐用于新代码。
command
被解析为命令加上由空格分隔的参数。因此,如果命令的路径(或单个参数,例如文件路径)包含空格,则必须用引号引起来,例如经过shQuote
。类 Unix 系统将命令行传递给 shell(通常是‘/bin/sh’,并且 POSIX 需要该 shell),所以command
可以是 shell 认为可执行的任何内容,包括 shell 脚本,并且它可以包含多个命令,用;
.
在 Windows 上,system
不使用 shell,并且有一个单独的函数 shell
将命令行传递给 shell。
如果intern
是TRUE
然后popen
用于调用命令并将输出逐行收集到R
character
向量。如果intern
是FALSE
然后是C函数system
用于调用命令。
wait
是通过将 &
附加到命令来实现的:这原则上是 shell-dependent,但 POSIX 要求并因此得到广泛支持。
当timeout
不为零时,命令将在给定秒数后终止。终止适用于典型命令,但不能保证:可以编写一个在超时后继续运行的程序。超时只能使用 wait = TRUE
设置。
超时不能与交互式命令一起使用:该命令使用从“重定向”的标准输入运行/dev/空’并且不得修改终端设置。只要有ttytostop
选项被禁用,通常默认情况下是禁用的,执行的命令可能会写入标准输出和标准错误。不能指望子进程的执行时间会包含在其中user.child
和sys.child
的元素proc_time
由返回proc.time
。对于要包含的时间,所有子进程都必须等待其父进程,这必须在父应用程序中实现。
前两个参数之后的参数顺序有时会发生变化:建议将所有参数命名在第一个参数之后。
使用 system
来确定命令是否可以运行有很多陷阱 — Sys.which
更合适。
receive.console.signals = TRUE
在运行异步进程(使用 wait = FALSE
)来实现同步操作时很有用。在所有其他情况下,建议使用默认值。
值
如果intern = TRUE
,给出命令输出的字符向量,每个字符串一行。 (在某些系统上,超过 8095 字节的输出行将被分割。)如果该命令无法运行,R产生错误。如果command
运行但给出非零退出状态,这将在属性中报告并带有警告"status"
结果的:一个属性"errmsg"
也可能可用。
如果intern = FALSE
,返回值是错误代码(0
成功),给定不可见属性(因此需要显式打印)。如果该命令因任何原因无法运行,则该值为127
并发出警告(从R3.5.0)。否则如果wait = TRUE
该值是命令返回的退出状态,如果wait = FALSE
这是0
(常规成功值)。
如果命令超时,则会报告警告,退出状态为 124
。
标准输出和标准错误
对于命令行R,错误消息写入‘标准错误' 将被发送到终端,除非ignore.stderr = TRUE
。它们可以被捕获(在最有可能的壳中)
system("some command 2>&1", intern = TRUE)
对于 GUI,发送到‘的输出会发生什么?标准输出' 或者 '标准错误' 如果intern = FALSE
是interface-specific,假设此类消息将出现在 GUI 控制台上是不安全的(它们出现在 macOS GUI 控制台上,但不会出现在其他一些控制台上)。
Unix 和 Windows 之间的差异
Windows 和类 Unix 操作系统之间的进程启动方式存在根本差异,其上的高级操作系统函数也存在差异。R函数已构建。因此,操作系统之间在如何处理方面存在许多差异也就不足为奇了。system
行为。为了程序员的利益,本节总结了比较重要的内容。
-
最重要的区别是,在类似 Unix 的
system
上启动一个 shell,然后运行command
。在 Windows 上,该命令直接运行 - 使用shell
作为通过 shell 运行command
的接口(默认情况下 Windows shellcmd.exe
,它与 POSIX shell 有很多区别)。这意味着不能假设重定向或管道在
system
中起作用(重定向有时会起作用,但我们已经看到在 Windows 安全补丁后它停止工作的情况),并且system2
(或shell
)必须是在 Windows 上使用。 -
会发生什么
stdout
和stderr
何时未被捕获取决于如何捕获R正在运行:Windows 批处理命令的行为与 Unix 类似,但从 Windows GUI 中它们通常会丢失。system(intern = TRUE)
捕获‘标准错误' 当从 Windows GUI 控制台运行时,除非ignore.stderr = TRUE
. -
错误时的行为有微妙的不同(并且在R版本)。
-
command
的引用约定有所不同,但shQuote
是一个可移植接口。 -
参数
show.output.on.console
、minimized
、invisible
仅在 Windows 上执行某些操作(并且与那里的Rgui
最相关)。
例子
# list all files in the current directory using the -F flag
## Not run: system("ls -F")
# t1 is a character vector, each element giving a 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.
也可以看看
man system
和 man sh
了解如何在正在使用的操作系统上实现这一点。
.Platform
用于特定于平台的变量。
pipe
设置管道连接。
相关用法
- R system.file 查找 R 系统文件的名称
- R system.time 使用的 CPU 时间
- R system2 调用系统命令
- R sys.parent 访问函数调用堆栈的函数
- R sys.source 解析和评估文件中的表达式
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R search 给出 R 对象的搜索路径
- R solve 求解方程组
- R scan 读取数据值
- R sprintf 使用 C 风格字符串格式化命令
- R stop 停止函数执行
- R sign 标志函数
- R svd 矩阵的奇异值分解
- R strtoi 将字符串转换为整数
- R source 从文件、连接或表达式中读取 R 代码
- R sQuote 引用文字
- R switch 选择替代方案列表之一
- R substitute 替换和引用表达式
- R strrep 重复字符向量的元素
- R split 分组并重新集合
- R slice.index 数组中的切片索引
- R sort 对向量进行排序或排序
- R standardGeneric 形式化方法系统 – 调度 S4 方法
- R sequence 创建序列向量
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Invoke a System Command。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。