Ruby 脚本:shebang ruby 的绝对路径不起作用

Ruby script: shebang with absolute path to ruby not working

我正在使用 Mac OS X。我安装了 Ruby 的两个版本(2.1.5 和 2.0.0)。前者安装在/another/.path/to/ruby("path"前有一个点来模拟路径之间包含一个点头目录的事实),除了默认的系统一(版本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

它输出'hey there'。好的。同时,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

它正常输出'hey there'。看起来 shebang 使用 /usr/bin/env ruby 完美运行,但不适用于新安装的绝对路径 ruby?

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

./rbs

谢谢!

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

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

另一方面,因为 /usr/bin/env 一个可执行文件,你总是可以使用像 #!/usr/bin/env ruby 这样的东西,即使 ruby 它在路径中发现它本身就是一个脚本。

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

#!/usr/bin/env ruby

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

source