【问题标题】:Ruby script: shebang with absolute path to ruby not workingRuby脚本:带有Ruby绝对路径的shebang不起作用
【发布时间】:2015-03-04 19:49:55
【问题描述】:

我使用的是 Mac OS X。我安装了两个版本的 Ruby(2.1.5 和 2.0.0)。前者安装在 /another/.path/to/ruby (“路径”之前有一个点,以模仿路径之间包含点头目录的事实),除了默认系统(版本 2.0. 0) 在/usr/bin/ruby.我使用 rbenv 安装 Ruby。

在我手动设置 PATH 环境变量后,默认的 ruby​​ 命令将在另一个目录中找到:/another/.path/to/ruby。现在我检查

which -a ruby

它首先使用正确的 ruby​​ 作为输出。

/another/.path/to/ruby
/usr/bin/ruby

现在我创建一个脚本 rbs,shebang 的第一行指定要使用的 ruby​​。

#!/usr/bin/env ruby
puts 'hey there'

然后我跑

./rbs

它输出'嘿那里'。好的。同时,Ruby 使用的是正确的版本。

/usr/bin/env ruby --version

还有

ruby --version

两者都输出 2.1.5。所以使用新版本效果很好。

但是,问题出现在此处:现在我将 rbs 文件更新为:

#!/another/.path/to/ruby
puts 'hey there'

请注意,我更新了 shebang 以使用所需 ruby​​ 的绝对路径。然后我跑

./rbs

它输出:

./rbs: line 2: puts: command not found

这太奇怪了;

但是如果我跑了

ruby ./rbs

它正常输出“嘿,那里”。看起来 shebang 使用 /usr/bin/env ruby​​ 可以完美运行,但不适用于新安装 ruby​​ 的绝对路径?

这是为什么?有没有办法修复它,以便通过键入以下内容更新的脚本仍然可以工作?

./rbs

谢谢!

【问题讨论】:

  • ./rubyscript 在您的./rbs 输出中是什么?
  • 抱歉,打错字了。我会更新它。它只是 ./rbs 文件。
  • /another/.path/to/ruby rbs 工作吗?

标签: ruby environment-variables shebang


【解决方案1】:

puts: command not found 消息表明您的脚本不是由 Ruby 运行,而是由 shell 运行。所以首先,我会仔细检查你的 shebang 行的语法和路径。

其次,请注意 rbenv 使用 shim 动态查找和运行正确版本的 ruby(以及相关的程序,如 gem 等)。但是垫片是脚本,而脚本本身不能是 shebang 解释器;您必须找到并使用 ruby​​ 可执行文件的实际路径(rbenv which ruby 的输出)。

另一方面,由于/usr/bin/env 一个可执行文件,你总是可以使用类似#!/usr/bin/env ruby的东西,即使它在路径中找到的ruby本身就是一个脚本。

【讨论】:

  • 这是一个很好的答案!谢谢,马克。您认为 shim 本身不能成为 shebang 解释器的脚本是完全有道理的。
【解决方案2】:

我不能发表评论,(否则我会作为评论添加)但我认为值得添加

#!/usr/bin/env ruby

必须是文件的第一行。这让我绊倒了一段时间。

source

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-12
    • 2016-01-01
    • 2023-03-31
    • 1970-01-01
    • 2013-07-06
    • 2011-04-04
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多