2013-05-02 75 views
0

我在.rb文件中有一些Ruby代碼,我嘗試使用Automator運行而不是命令行。下面是代碼的樣本(文件名是「filelines_revise.rb」):Mac Automator(OS 10.7)不能讀取Ruby 1.9.3?

lines = IO.readlines('filelines_before_CAP.txt').map do |line| 

    array = line.split.each { |i| i.capitalize! } 

    if array.include?("Ws") 
    array.delete("Ws") 
    array[-1,0] = "Ws" 
    end 

    if array.include?("Es") 
    array.delete("Es") 
    array[-1,0] = "Es" 
    end 

    array_2 = array.join(" ") 

    array_2.gsub(/ Ws /, ", west side") 
     .gsub(/ ES /, ", east side") 
end 

File.open('filelines_after_CAP.txt', 'w') do |file| 
    file.puts lines 
end 

當我使用命令行命令「紅寶石/Desktop/filelines_revise/filelines_revise.rb」運行此代碼和代碼運行正常。它會找到原始的.txt文件,讀取每行,按代碼指示更改文件,然後使用修改後的行創建一個新文件。

當我嘗試將它作爲工作流或應用程序放入Automator時,我將Run Shell Script放到我的流中,使用/ bin/bash和Pass輸入:to stdin,然後命令「ruby/Desktop/filelines_revise/filelines_revise.rb」。當我去運行該腳本,我得到一個錯誤閱讀:

桌面/ filelines_revise/filelines_revise.rb:「」 18語法錯誤,意外,預計DMOZ目錄

第18行是第二.gsub」 .gsub (/ ES /,「,東側」)「。

是否有可能Automator不使用我的Ruby 1.9.3作爲命令行呢?也許我應該對此有不同的看法?提前致謝。

+0

「第18行是第二個.gsub'.gsub(/ ES /,」,east side「)'列在上面的代碼中,如果你把它關閉(把它放在與第一行相同的行上gsub)能解決它嗎? – matt 2013-05-02 17:43:58

+0

@matt它修復了我運行服務時,但不是應用程序。一旦我做了,它告訴我它找不到該文件。我將與一個服務,但將離開,因爲我寧願有一天的應用程序。 – jmitchell1009 2013-05-03 10:47:30

回答

0

您的Ruby版本是如何確定的?我敢打賭,Automator對此一無所知。它可能正在運行內置的Ruby 1.8.7。您可以通過在腳本過程中檢查RUBY_VERSION來輕鬆檢查。然後

的問題是,對於雙clickables(類似的Automator)的shell環境是不一樣的,作爲終端的shell環境(使用你的.bash_profile)。順便說一句,BBEdit在版本10.5之前都有同樣的問題。對於雙擊應用程序來說,需要特別的努力來獲取終端shell環境,並且大多數應用程序不會付出努力。

編輯:我看看Automator,發現如果你運行一個shell腳本,你用運行外殼腳本操作逐字輸入,你必須將彈出框切換到/usr/bin/ruby。但當然我的紅寶石是而不是紅寶石在/usr/bin/ruby/usr/bin/ruby是1.8.7;那是我做的紅寶石不是想用。你不能提供一個shebang線!

所以我彈出設置爲/bin/bash/和運行此腳本:

/usr/bin/env ruby /Users/matt/Desktop/test.rb 

其中test.rb寫着:

puts RUBY_VERSION 

運行即中的Automator,我還是得到了 「1.8.7」。我也嘗試了它作爲應用程序和服務;相同的結果。所以我認爲你不能使用Automator除了內置的ruby 1.8.7以外的其他東西,而沒有直接指向你想要的ruby;它並不像終端那樣從外殼中撿起它。

+0

我不知道如何判斷Automator默認的版本。在命令行中,它說1.9.3。我仍然沒有想出如何製作雙擊應用程序,但是我確實得到了它的服務,這將適合我現在的需要。我會留下這個問題,因爲我認爲它仍然是有價值的,寧願有一個應用程序而不是服務。 – jmitchell1009 2013-05-03 10:46:12

+0

正如我所說,請參閱腳本中的'RUBY_VERSION'以瞭解您正在運行的是哪個版本的ruby。 – matt 2013-05-03 15:02:08

+0

@ jmitchell1009爲了擴展@matt優秀的答案,它看起來像你想要做的是特定的,所以代碼不需要是可移植的。如果是這樣的話,你可以硬編碼到你想要的紅寶石版本的完整路徑。要知道它在哪裏,你可以在終端窗口中運行'which ruby​​'。一旦你有了路徑,你可以在腳本中指定它,例如'path/to/ruby​​ path/to/script'。 – user2276204 2013-05-09 03:54:19