将system2与包含&符号的参数一起使用(&)

问题描述 投票:0回答:1

我想运行类似的东西

stat --format '%m' $file

来自R.所以我把它翻译成了

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

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

r command-line
1个回答
0
投票

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

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

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

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

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

Security

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

file <- "foo&touch foo"

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

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

© www.soinside.com 2019 - 2024. All rights reserved.