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

Bru*_*uce 1 ruby shebang environment-variables

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

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

which -a ruby
Run Code Online (Sandbox Code Playgroud)

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

/another/.path/to/ruby
/usr/bin/ruby
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/env ruby
puts 'hey there'
Run Code Online (Sandbox Code Playgroud)

然后我跑了

./rbs
Run Code Online (Sandbox Code Playgroud)

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

/usr/bin/env ruby --version
Run Code Online (Sandbox Code Playgroud)

以及

ruby --version
Run Code Online (Sandbox Code Playgroud)

两者输出2.1.5.所以使用新版本确实很棒.

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

#!/another/.path/to/ruby
puts 'hey there'
Run Code Online (Sandbox Code Playgroud)

请注意,我更新了shebang以使用所需红宝石的绝对路径.然后我跑了

./rbs
Run Code Online (Sandbox Code Playgroud)

它输出:

./rbs: line 2: puts: command not found
Run Code Online (Sandbox Code Playgroud)

这太奇怪了;

但如果我跑

ruby ./rbs
Run Code Online (Sandbox Code Playgroud)

它输出'嘿那里'正常.看起来shebang使用/ usr/bin/env ruby​​是完美的,但不是新安装的ruby的绝对路径?

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

./rbs
Run Code Online (Sandbox Code Playgroud)

谢谢!

Mar*_*eed 7

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

其次,请注意rbenv使用动态查找和运行正确版本ruby(以及相关程序gem等)的填充程序.但垫片是脚本,脚本本身不是shebang口译员 ; 你必须找到并使用ruby可执行文件的实际路径(作为输出rbenv which ruby).

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