【问题标题】:Mac Automator (OS 10.7) not reading Ruby 1.9.3?Mac Automator (OS 10.7) 没有读取 Ruby 1.9.3?
【发布时间】:2023-04-02 18:56:01
【问题描述】:

我在 .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 输入:到 stdin,然后命令“ruby /Desktop/filelines_revise /filelines_revise.rb”。当我去运行脚本时,我得到一个错误读数:

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

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

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

【问题讨论】:

  • "第 18 行是上面代码中列出的第二个 .gsub .gsub(/ ES /, ", east side")" 是的,如果您关闭它(将其与第一个 gsub 放在同一行),是否可以解决问题?
  • @matt 它在我运行服务而不是应用程序时修复它。一旦我这样做,它告诉我找不到文件。我将使用一项服务,但会保持打开状态,因为我希望有一天有一个应用程序。

标签: ruby-1.9.3 automator


【解决方案1】:

您的 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。但当然,我的红宝石不是/usr/bin/ruby 的红宝石。 /usr/bin/ruby 是 1.8.7;那是我不想想要使用的红宝石。而且你不能提供shebang line!

所以我将弹出窗口设置为 /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​​;它不像终端那样从外壳中提取它。

【讨论】:

  • 我不知道如何判断 Automator 默认使用哪个版本。在命令行中,它显示 1.9.3。我还没有弄清楚如何制作一个可双击的应用程序,但是我确实让它与一个服务一起工作,这将满足我现在的需要。我将保留这个问题,因为我认为它仍然很有价值,并且宁愿拥有应用程序而不是服务。
  • 如我所说,请从您的脚本中咨询RUBY_VERSION,以了解您正在运行的 ruby​​ 版本。
  • @jmitchell1009 为了扩展@matt 出色的答案,看起来您正在尝试做的是特定的,因此代码不需要是可移植的。如果是这种情况,您可以硬编码所需的 ruby​​ 版本的完整路径。要查看它在哪里,您可以在终端窗口中运行 which ruby。获得路径后,您可以在脚本中指定它,例如 path/to/ruby path/to/script
猜你喜欢
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多