2013-05-02 3 views
0

У меня есть код Ruby в файле .rb, который я пытаюсь запустить с помощью 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». Когда я иду, чтобы запустить сценарий, я получаю ошибка чтения:

Desktop/filelines_revise/filelines_revise.rb: '' 18 синтаксическая ошибка, неожиданный, ожидая Kend

линия 18 является вторым .gsub».gsub (/ ES /, ", восточная сторона") ", перечисленные в коде выше.

Возможно ли, что Automator не использует мой Ruby 1.9.3 в командной строке? Может быть, мне следовало бы поступить иначе? Заранее спасибо.

+0

«Строка 18 - это второй .gsub' .gsub (/ ES /, «, восточная сторона») ', указанный в приведенном выше коде« Да, и если вы закроете это (поместите его в одну строку с первой gsub) это исправляет? – matt

+0

@matt он исправляет это, когда я запускаю Сервис, но не приложение. Как только я это сделал, он сказал, что не может найти файл. Я собираюсь с Сервисом, но остаюсь открытым, поскольку однажды у меня будет приложение. – jmitchell1009

ответ

0

Как определяется ваша версия Ruby? Я уверен, что Automator ничего не знает об этом. Вероятно, он работает с встроенным Ruby 1.8.7. Вы можете легко проверить это, изучив RUBY_VERSION в ходе вашего скрипта.

Проблема заключалась бы в том, что оболочечная среда для двойных кликов (например, Automator) не совпадает с средой оболочки для терминала (которая использует ваш .bash_profile).

BBEdit имел ту же проблему до версии 10.5, между прочим. Для приложения с двойным щелчком для приложения среды оболочки терминала требуется особое усилие, и большинство приложений не делают этого.

EDIT: я взглянул на Automator и обнаружил, что если вы запустите сценарий оболочки, который вы в буквальном смысле вводите с помощью действия Run Shell Script, вам нужно переключить всплывающее окно на /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, не указывая прямо на рубин, который вам нужен; он не подбирает его из оболочки так, как это делает Terminal.

+0

Я не знаю, как определить, в какую версию по умолчанию установлен Automator. В командной строке сказано 1.9.3. Я до сих пор не понял, как сделать приложение с двойным щелчком, однако я получил его для работы с Сервисом, который подойдет моим потребностям. Я оставлю этот вопрос открытым, поскольку я думаю, что он по-прежнему ценен и скорее имеет приложение, чем услугу. – jmitchell1009

+0

Как я уже сказал, проконсультируйтесь с 'RUBY_VERSION' из своего сценария, чтобы узнать, в какой версии рубина вы работаете. – matt

+0

@ jmitchell1009 Чтобы продлить @matt отличный ответ, похоже, что то, что вы пытаетесь сделать, является конкретным, поэтому код не должен быть портативным. Если это так, вы можете запрограммировать полный путь к нужной вам рубине. Чтобы увидеть, где это, вы можете запустить 'which ruby' в окне терминала. После того, как у вас есть путь, вы можете указать его в своем скрипте, например, путь/путь/рубины/в/скрипт. – user2276204