我正在使用Frank进行iOS测试。它是一种使用黄瓜的红宝石宝石。我有一个“Given”步骤,用于检查应用程序是否正在运行或是否已崩溃。如果我的步骤发现它已崩溃,我想再次启动该应用程序。我使用shell脚本启动应用程序,该脚本存储在黄瓜.feature文件附近。
如何从该步骤定义调用脚本?
答案 0 :(得分:3)
你可以用几种不同的方式做到这一点
Kernel.system "command"
%x[command]
`command`
答案 1 :(得分:2)
正如其他答案所建议的那样,有许多方法可以从Ruby执行shell脚本,但它们都不是平等的。我将尝试更详细地解释我所知道的所有方法。
`command arg1 arg2`
%x(command arg1 arg2)
在子shell中运行命令并返回命令的输出。该命令及其参数作为由反引号分隔的字符串提供。另一种语法是%x(...)
,用于避免逃避问题,例如当你想执行一个包含反引号的命令时。括号可以替换为其他分隔符,例如[]
,{}
,!!
,...,以便能够解决任何转义问题。
Stderr正常打印,Stdout被抑制。返回命令的stdout输出。这意味着您可以使用反引号表示法将命令输出到变量中以进行进一步处理。
exec("command arg1 arg2")
exec("command", "arg1", "arg2")
通过运行命令替换当前进程。该命令及其参数以普通字符串或逗号分隔的字符串列表的形式提供。如果您已将参数列表作为数组,则可能很有用。输出保持原样,即将打印到控制台,就像命令直接运行一样。
system("command arg1 arg2")
system("command","arg1 arg2")
与Kernel.exec
类似,但再次在子shell中运行。如果进程正确退出(状态0),则返回true
,否则返回false
。这在if
- 语句中很有用。
pid = spawn("command")
# do other stuff
Process.wait(pid)
与Kernel.system
类似,但会生成子进程以运行指定的命令。因此,除非使用Process.wait
,否则父进程将不会等待命令完成执行。返回值是生成进程的PID。
io = IO.popen("command")
IO.popen("command") {|io| ... }
再次在子进程中运行该命令,但允许更好地控制IO。子进程'stdout和stdin连接到IO对象,该对象可作为返回值或块参数访问。如果通过返回值获取,则应在使用io.close
后将IO对象关闭。
答案 2 :(得分:1)
对于比system
或IO.popen
更高级的用例,可以使用Ruby标准库中的Open3。它的popen3
方法使您可以手动与子进程的stdin,stdout和stderr进行交互。 Open3的popen2
方法是相同的,只是它不会给您stderr。使用popen2
的示例:
require 'open3'
Open3.popen2("wc -c") do |stdin, stdout, status_thread|
stdin.print "answer to life the universe and everything"
stdin.close
p stdout.gets #=> "42\n"
end
答案 3 :(得分:-1)
Here are some nice ways。反引号可能是最不具侵入性的。但要注意:正如tadman所指出的,exec
终止了调用过程,可以通过创建子进程或使用system
来避免调用过程。