我试图创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
收到两个参数: -tfoo
和bar
因为它们之间有空格。
为了避免这种情况,你必须以某种方式逃离这个空间。 所有这些(还有更多)将工作:
$ 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"
,包括引号字符。