簡體   English   中英

從ruby運行一個shell腳本

[英]Run a shell script from ruby

我正在使用Frank進行iOS測試。 這是一種也使用黃瓜的紅寶石寶石。 我有一個“給定”步驟,用於檢查應用程序是否正在運行或崩潰。 如果我的步驟發現它崩潰了,我想再次啟動該應用程序。 我使用外殼腳本啟動應用程序,該腳本存儲在黃瓜.feature文件附近。

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

您可以通過幾種不同的方式執行此操作

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

正如其他答案所建議的那樣,有很多方法可以從Ruby執行Shell腳本,但是創建它們的方式並不相同。 我將嘗試更詳細地解釋我所知道的所有方法。

反引號

`command arg1 arg2`
%x(command arg1 arg2)

在子Shell中運行命令並返回命令的輸出。 該命令及其參數以反引號分隔的字符串形式提供。 另一種語法是%x(...) ,用於避免轉義問題,例如,當您要執行包含反引號本身的命令時。 括號可以用其他分隔符代替,例如[]{}!! ,以便能夠解決所有轉義問題。

正常打印Stderr,抑制Stdout。 返回命令的標准輸出。 這意味着您可以使用反引號表示法將命令的輸出轉換為變量以進行進一步處理。

內核執行

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

通過運行命令替換當前進程。 該命令及其參數以普通字符串或以逗號分隔的字符串列表形式提供。 如果您已經有一個參數列表作為數組,則可能很有用。 輸出保持不變,即就像直接運行命令一樣將其輸出到控制台。

內核系統

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

類似於Kernel.exec但再次在子Kernel.exec運行。 如果進程正確退出(狀態0),則返回true ,否則返回false if語句在內部非常有用。

內核生成

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

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

IO打開

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

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

打開3

對於比systemIO.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

這里有一些不錯的方法 反引號可能是最少干擾的。 但是要當心:正如tadman指出的那樣, exec終止了調用過程,可以通過創建子過程或使用system來避免該過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM