PAYATHON 2026

如何在 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() 更便于分别组织命令和参数。

备注:内容仅供参考。