使用带有&符号(&)的参数的system2

时间:2018-03-05 16:15:49

标签: r command-line

我想运行像

这样的东西
stat --format '%m' $file
来自R.的

所以我将其翻译为

system2("stat", args = c("--format", "'%m'", file)),
        stdout = TRUE)

除非文件名包含&符,否则此方法正常。在这种情况下,它似乎被解释为重定向。如何逃脱&符号(&)?

1 个答案:

答案 0 :(得分:0)

如果其中一个参数包含特殊字符,则需要引用它们,因此在这种情况下调用system2的正确方法是

system2("stat", args = c("--format", "'%m'", shQuote(file)), 
        stdout = TRUE)

如果您快速阅读帮助,您可能会认为引用了所有参数,但请注意:

  

与'system'不同,'command'始终引用'shQuote',因此它必须是没有参数的单个命令。

也就是说,默认情况下,参数不是shQuote

安全

当您无法信任您的输入时要小心,恶意用户可以为文件提供以下值:

file <- "foo&touch foo"

system2("stat", args = c("--format", "'%m'", file),
        stdout = TRUE)

将在您的工作目录中创建文件foo。它也可以做一些更邪恶的事情,好。