2012-09-10 232 views
1

注意:如果您想到更好的標題/問題,請隨時提出建議。我不確定如何用一個簡短的句子表達這個問題。從Ruby代碼執行shell命令

我創建了一個命令行Mastermind遊戲。要玩遊戲,請在命令行輸入play.rb

play.rb是啓動遊戲的Ruby腳本。在腳本中,遊戲被髮送一個界面,稱爲CommandLineInterface

如果你想使用GUI玩(我使用Ruby的GUI稱爲Limelight系列),你cdlimelight目錄,然後鍵入limelight open production和GUI打開。

有一個mastermind_game目錄包含lib,一個speclimelight目錄。 limelight目錄包含production目錄。

現在我正在做一些改變。您可以在命令行上將參數傳遞給腳本。您可以輸入play.rb "command line game"play.rb "limelight game"

ARGV是在命令行傳遞的參數數組。

if ARGV.include?("command line game") 
    interface = CommandLineInterface.new 
elsif ARGV.include?("limelight game") 
    interface = LimelightInterface.new 
end 

如果我想發揮我的命令行的比賽,我進入play.rb "command line game",它工作正常。

我希望能夠在命令行鍵入play.rb "limelight game"並打開GUI。在ARGV中,將找到參數"limelight game",因此interface將設置爲LimelightInterface.new。在我的LimelightInterface類中,我想要初始化方法來打開GUI。它應該具有與在命令行鍵入limelight open production相同的功能。

我不確定這是可能的或者如何去做,所以任何幫助將不勝感激!謝謝!

編輯:我試圖通過包括此行我的腳本來執行命令rvm use jruby

system("rvm use jruby") 

我回來:「RVM不是一個函數,選擇紅寶石與「RVM使用...' 不管用。」

+0

選擇一種Ruby的系統命令不應該是必需的;您可以使用[.rvmrc](http://bre.overnothing.com/workflow/rvmrc/)文件來選擇jruby。您可以將您要調用的內容存儲在子目錄中,並在那裏創建一個'.rvmrc'文件。 –

+0

好的,我創建了一個.rvmrc文件來指定我想要使用jruby。所以我所要做的就是將'system(「cd limelight」)'添加到我的腳本中,對嗎?只需將'cd'放入目錄,.rvmrc文件將運行jruby。我試圖做到這一點,但似乎沒有成功進入該目錄。 – rzv

+0

不,一個'.rvmrc'文件決定*在調用'ruby ...時運行哪個* Ruby,它不會啓動Ruby。您需要將cd放入目錄,然後啓動您的腳本。 –

回答

0

瑞恩,有幾種方式來調出該系統:

反引號: ruby -e 'p ARGV' '1 2' '3 4'#=> 「[\」 1 2 \ 「\ 」3 4 \「] \ n」 個

在%×文字(請注意,你可以使用任何你喜歡的分隔符,你不會受限於括號中)

%x(ruby -e 'p ARGV' '1 2' '3 4') # => "[\"1 2\", \"3 4\"]\n" 

system命令。這裏的區別是它通過了stdin/out/err。 (上面的返回標準輸出,這個打印在你的進程的標準輸出)。

system('ruby', '-e p ARGV', '1 2', '3 4') 
# >> ["1 2", "3 4"] 

如果你需要更復雜的使用,像open3從STDLIB已經很遠得到了我。如果你真的需要大槍(​​聽起來不像你這樣),那麼就有一顆寶石open4


編輯:

這聽起來像你想要做這樣的事情:

require 'open3' 

bash_script = <<SCRIPT 
source "$HOME/.rvm/scripts/rvm" 
rvm use jruby 
ruby -v 
exit 
SCRIPT 

out, err, status = Open3.capture3 'bash', stdin_data: bash_script 
puts out 
# >> Using /Users/joshcheek/.rvm/gems/jruby-1.6.7 
# >> jruby 1.6.7 (ruby-1.8.7-p357) (2012-02-22 3e82bc8) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_29) [darwin-x86_64-java] 

不過說實話,我不認爲這是您的具體情況很好的解決方案,因爲有許多合法的方法來爲您的環境設置jruby。我認爲最好是檢查一下風向標二進制文件是否存在,並告訴用戶如果沒有,就修復它們的環境。

+0

謝謝,這很有幫助。我和那些人一起玩,看看我能做什麼,我遇到的問題是我不能做shell(「rvm use jruby」)。它迴應道:「RVM不是一個函數,選擇'rvm use ...'的紅寶石將不起作用。」所以我想打電話給我的命令是「風光開放」,但要做到這一點,我首先必須做'rvm use jruby'。不知道如何做到這一點。 – rzv

+0

我發現[this SO post](http:// stackoverflow。com/questions/5792707/can not-change-rvm-gemset-from-shell-script-via-rvm-gemset-use),但我真的不明白他們在那裏提供的解決方案。 – rzv

+1

我編輯它以更適合你。 –

0

下面是從谷歌上搜索標題的第一個結果:http://tech.natemurray.com/2007/03/ruby-shell-commands.html

如果這不是你所需要的,我不明白的問題。

+0

是的,最初我的問題並非如此。我很努力地在Google上找到答案,因爲我不確定* Google是什麼。幾次改變問題後,我終於登上了「從Ruby代碼執行shell命令」。我剛剛在半小時前注意到這篇文章,所以我現在正在查看它。現在我明白瞭如何使用一些東西,比如反引號和'system',但是我還沒有能夠爲我的例子工作。 – rzv