通过ruby执行以下系统命令

时间:2014-04-26 10:40:42

标签: ruby macos shell rspec

我正在使用ruby执行系统命令。代码就像这样

commandtoexecute=“pararellrspec --type rspec -n 1 --test-options '--test "cases's owner"' testing/multi/getcreate.rb “

system(commandtoexecute)

执行上述行时会出现错误

sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file

但是,当我通过用上面的casess替换案例来执行时,它起作用。有没有人知道如何防止上述错误而不用“casess”替换“cases's”

3 个答案:

答案 0 :(得分:1)

你需要逃避双引号:

"pararellrspec --type rspec -n 1 --test-options '--test \"cases's owner\"' testing/multi/getcreate.rb"

编辑:也许那行单引号,想一想:

"pararellrspec --type rspec -n 1 --test-options '--test \"cases\'s owner\"' testing/multi/getcreate.rb"

或者如果按预期工作,可能会删除单引号而不是:

"pararellrspec --type rspec -n 1 --test-options --test \"cases's owner\" testing/multi/getcreate.rb"

或者(并且更好),在适当的时候使用system的数组风格,以便让Ruby为您处理引用参数:

system("echo *")
system("echo", "*")

http://www.ruby-doc.org/core-2.1.1/Kernel.html#method-i-system

答案 1 :(得分:0)

commandtoexecute="pararellrspec --type rspec -n 1 --test-options '--test "cases's owner"' testing/multi/getcreate.rb"
system(commandtoexecute)

你可以看到你有一个逃避问题"和'在你的命令字符串中。要绕过这个问题,你可以使用

%x(ruby --copyright)
> "ruby - Copyright (C) 1993-2013 Yukihiro Matsumoto\n"

在ruby中执行shell命令。这种速记方法可以处理任何必要的转义。所以你的原始代码归结为:

%x(pararellrspec --type rspec -n 1 --test-options '--test "cases's owner"' testing/multi/getcreate.rb)

正如您所看到的,因为您不需要"来创建一个包含您的命令的字符串(正如您在commandtoexecute上面所做的那样),转义问题就消失了。

答案 2 :(得分:0)

不确定请尝试这样: -

1.9.3p448 :025 > commandtoexecute="pararellrspec --type rspec -n 1 --test-options '--test 'cases\'s owner' testing/multi/getcreate.rb"

  => "pararellrspec --type rspec -n 1 --test-options '--test 'cases's owner' testing/multi/getcreate.rb"

1.9.3p448 :026 > system(commandtoexecute)

这样可以试试。

click了解更多详情。