我试图创建一个运行以下命令的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\\\""
这也显然是错误的。
如何才能使最后一个参数正确?
答案 0 :(得分:2)
TL; DR - 在Ruby中使用'-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"
,包括引号字符。