git log --grep="foo"
中生成这个命令。这可以在命令行中正常工作。
所以我继续这样试试。
Command::new("git")
.arg("log")
.arg("--grep=\"foo\"")
.spawn()
这不起作用。
如果我把它改成这个,我可以让它工作:
Command::new("git")
.arg("log")
.arg("--grep=foo")
.spawn()
但这只能起作用,因为在这个简单的情况下可以省略引号,因此它将运行git log --grep=foo
,这不是我想要的。我使用format!
等尝试了很多不同的版本。我正在拔头发。
我试图用dtruss
跟踪它,以弄清楚Rust实际上最终会使用什么,但我也没有运气。 :/
更新
好的,我解决了这个问题。这对我来说有点棘手(至少对我而言)。
我想要运行的命令是git log --grep="foo|bar" -E
。这需要在命令行上执行引号。但同样重要的是要注意它需要与-E
参数结合使用。
在Rust中我需要删除引号。
Command::new("git")
.arg("log")
.arg("-E")
.arg("--grep=foo|bar")
.spawn()
我仍然想知道为什么我必须省略Rust中的引号。
答案 0 :(得分:2)
我仍然想知道为什么我必须省略Rust中的引号。
因为你没有shell来解释它们。
当您从shell启动命令时,您需要它们,因为git log --grep=foo|bar -E
将被解释为管道git log --grep=foo
到bar -E
。
然而,在shell解释了命令之后,git
接收的参数实际上是log
,--grep=foo|bar
和-E
。
从Rust调用命令时,shell没有对命令的解释,因此您不需要引号。将引用与从shell
运行此命令相同git log --grep='"foo|bar"' -E