如何在 R 脚本中执行 svn 命令并获取输出?
数据阿明
在 R 中,可以用 system2() 执行 svn。设置 stdout = TRUE 后,可以将标准输出保存到变量中。返回值通常是字符向量,每个元素对应一行输出。
执行 svn 命令并获取输出
filename <- "a.txt"
ret <- system2(
command = "svn",
args = c("log", shQuote(filename)),
stdout = TRUE
)
cat(ret, sep = "\n")
这相当于运行:
svn log a.txt
如果要获取原 Python 示例中的文件信息,将 "log" 改为 "info":
ret <- system2(
command = "svn",
args = c("info", shQuote(filename)),
stdout = TRUE
)
svn log 获取提交日志,svn info 获取目标的相关信息,可以按需选择。
将多行输出合并为一个字符串
如果希望像 Python 的 subprocess.check_output(..., text=True) 一样,将结果作为单个字符串处理,可以合并输出行:
output_text <- paste(ret, collapse = "\n")
这会在各行之间插入换行符,但不会还原原始输出末尾是否存在换行符。
捕获错误信息并检查退出状态
需要同时收集标准输出和标准错误时,可以设置 stderr = TRUE:
ret <- system2(
command = "svn",
args = c("log", shQuote(filename)),
stdout = TRUE,
stderr = TRUE
)
status <- attr(ret, "status")
if (is.null(status)) {
status <- 0L
}
if (status != 0L) {
stop(
sprintf(
"svn 执行失败,退出状态为 %s:\n%s",
status,
paste(ret, collapse = "\n")
),
call. = FALSE
)
}
这种写法会将错误信息合并到 ret 中。命令返回非零退出状态时,R 通常还会发出警告;Python 的 check_output() 则会直接抛出异常,因此在 R 中需要显式检查状态。如果程序无法启动,也可能直接产生 R 错误。
运行前需要确认什么
svn已安装,且 R 进程可以通过PATH找到它;也可以在command中指定可执行文件的完整路径。a.txt相对于 R 当前工作目录解析。可以用getwd()查看当前目录,也可以传入文件的完整路径。- 文件路径参数使用
shQuote()处理,避免路径包含空格时被拆成多个参数。
简单场景也可以使用 system("svn log a.txt", intern = TRUE)。需要动态传入文件名时,system2() 更便于分别组织命令和参数。
备注:内容仅供参考。
