传递带有引号的cmdline参数

我试图创build一个ruby脚本,将运行以下命令:

UV4.exe -j0 -cr test.uvprojx -t"test" 

我试过使用Open3.capture3:

 Open3.capture3("UV4.exe", '-j0', '-cr', 'test.uvprojx', '-t"test"') 

我所遇到的问题是最后一个争论

 "-t\"test\"" 

这导致了UV4(Keil uVision IDE)的错误。 如果我试图逃避我得到的报价

 "-t\\\"test\\\"" 

这显然也是错误的。

我怎样才能得到正确的最后一个论点?

TL; DR – 在Ruby中使用'-ttest'而不是'-ttest' '-t"test"'


如果你输入

 $ cmd -t"foo" 

在命令行中,引号不会传递给cmd 。 相反, cmd收到一个参数-tfoo 。 这相当于:

 $ cmd -tfoo 

但是如果你输入:

 $ cmd -tfoo bar 

那么cmd收到两个参数: -tfoobar因为它们之间有空格。

为了避免这种情况,你必须以某种方式逃离这个空间。 所有这些(还有更多)将工作:

 $ cmd -tfoo\ bar $ cmd -t"foo bar" $ cmd "-tfoo bar" 

有了上面的任何一个, cmd都会收到一个参数-tfoo bar

另一方面,在Ruby中, capture3将为您处理这个问题,所以不需要引号。 您只需将命令行参数作为单独的方法参数传递即可:

 Open3.capture3('cmd', '-tfoo bar') # $ cmd -tfoo bar Open3.capture3('cmd', '-tfoo', 'bar') # $ cmd -tfoo\ bar 

如果你添加" Ruby假定你想从字面上传递这个字符:

 Open3.capture3('cmd', '-t"foo bar"') 

相当于:

 $ cmd -t'"foo bar"' 

cmd接收一个参数-t"foo bar" ,包括引号字符。