2013-07-29 248 views
4

我正在使用Frank做iOS測試。這也是使用黃瓜的紅寶石寶石。我有一個「給定」的步驟,檢查應用程序是否正在運行或者是否崩潰。如果我的步驟發現它已經崩潰,我想再次啓動應用程序。我使用存儲在黃瓜.feature文件附近的shell腳本啓動應用程序。從ruby運行shell腳本

如何從該步驟定義調用腳本?

回答

3

你可以這樣做幾種不同的方式

Kernel.system "command" 
%x[command] 
`command` 
+0

順便說一下,你不需要'Kernel.';該模塊默認已包含在Object中。或類似的東西。 – Jwosty

+2

是的,除非你有一個名字相同的本地方法,'Kernel'前綴是多餘的,但是它與查找文檔相關。那些出現在各處的神奇方法通常都在Kernel中。 – tadman

+0

命名空間總是很好,因爲@tadman說的確切原因。 –

0

Here are some nice ways。反引號可能是最不具侵略性的。但要小心:正如tadman指出的那樣,exec終止了調用過程,可以通過創建子進程或使用system來避免調用過程。

+0

偉大的鏈接!你Goggled .. :) –

+0

是的,確實! :D – Jwosty

+0

請記住,['exec'](http://www.ruby-doc.org/core-2.0/Kernel.html#method-i-exec)有效地終止了調用過程,所以你永遠不會得到響應,所以它可能是該列表中的最後一個。爲什麼它是最「可讀」的? – tadman

1

至於其他的答案中建議,有來自Ruby的執行shell腳本的方法很多,但他們都沒有創造平等的。我會盡力詳細解釋我所知道的所有方法。

反引號
`command arg1 arg2` 
%x(command arg1 arg2) 

運行在子shell命令並返回命令的輸出。該命令及其參數作爲由反引號分隔的字符串提供。另一種語法是%x(...),其用於避免轉義問題,例如,當你想執行一個包含反引號的命令時。括號可以被其他分隔符替代,例如[],{},!!,...以便能夠解決幾乎任何轉義問題。

Stderr正常打印,Stdout被抑制。返回命令的stdout輸出。這意味着您可以使用反引號表示將命令的輸出轉化爲變量以供進一步處理。

Kernel.exec
exec("command arg1 arg2") 
exec("command", "arg1", "arg2") 

通過運行命令替換當前過程。該命令及其參數以普通字符串或逗號分隔的字符串列表的形式提供。如果您已經有一個參數列表作爲數組,那麼它會很有用。輸出保持原樣,即將被打印到控制檯,就好像該命令直接運行一樣。

Kernel.system

system("command arg1 arg2") 
system("command","arg1 arg2") 

Kernel.exec但在子shell再次運行。如果進程正確退出(狀態0),返回true,否則返回false。這在if -statements裏面很好用。

Kernel.spawn

pid = spawn("command") 
# do other stuff 
Process.wait(pid) 

Kernel.system類似,但會生成一個子進程來運行指定的命令。因此父進程不會等待命令完成執行,除非使用Process.wait。返回值是派生進程的PID。

IO。popen

io = IO.popen("command") 
IO.popen("command") {|io| ... } 

再次在子進程中運行命令,但允許更好地控制IO。子進程的stdout和stdin連接到一個可以作爲返回值或塊參數訪問的IO對象。如果通過返回值獲得,IO對象應在與io.close一起使用後關閉。