0

我在 .rb 文件中有一些 Ruby 代码,我试图使用 Automator 运行,而不是命令行。这是代码示例(文件名是“filelines_revise.rb”):

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

当我使用命令行命令“ruby /Desktop/filelines_revise/filelines_revise.rb”运行此代码时,代码运行良好。它找到原始的 .txt 文件,读取每一行,按照代码的指示更改文件,然后使用修改后的行创建一个新文件。

当我尝试将其作为工作流或应用程序放入 Automator 时,我将运行 Shell 脚本放入我的流程中,使用 /bin/bash 和 Pass 输入:到标准输入,然后是命令“ruby /Desktop/filelines_revise/filelines_revise。 rb”。当我去运行脚本时,我得到一个错误阅读:

Desktop/filelines_revise/filelines_revise.rb:18 语法错误,意外 '.',期待 Kend

第 18 行是上面代码中列出的第 2 个 .gsub ".gsub(/ES/, ", east side")"。

Automator 是否有可能不像命令行那样使用我的 Ruby 1.9.3?也许我应该以不同的方式解决这个问题?提前致谢。

4

1 回答 1

0

你的 Ruby 版本是如何确定的?我打赌Automator对此一无所知。它可能正在运行内置的 Ruby 1.8.7。RUBY_VERSION您可以通过在脚本过程中检查来轻松检查。

那么问题是双击的shell环境(如Automator)与终端的shell环境(使用你的.bash_profile)不同。

顺便说一句,BBEdit 在 10.5 版之前也有同样的问题。可双击应用程序需要特别努力才能拾取终端 shell 环境,而大多数应用程序都不会这样做。

编辑:我查看了 Automator 并发现,如果您运行一个使用 Run Shell Script 操作逐字输入的 shell 脚本,则必须将弹出窗口切换为/usr/bin/ruby. 但当然,我的 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​​;它不像终端那样从外壳中拾取它。

于 2013-05-02T17:45:12.927 回答