Ruby shebang适用于多个版本

Ruby shebang适用于多个版本,ruby,rvm,rbenv,shebang,Ruby,Rvm,Rbenv,Shebang,在我的大量Ruby脚本集合中,我确实使用常见的shebang来启动脚本: #!/usr/bin/env ruby 现在我发现一些脚本确实需要特定的Ruby版本,不,它们不是可以在特定Ruby版本下部署的Rails应用程序。它们只是可以从命令行启动的单文件脚本,无法与系统版本一起工作 在运行文件的以下代码之前,有没有办法编写一个shebang,用rbenv/rvm设置环境?rbenv将查找由设置的.ruby version文件(例如) $rbenv本地1.9.3-p448 创建一个简单的文件,

在我的大量Ruby脚本集合中,我确实使用常见的shebang来启动脚本:

#!/usr/bin/env ruby
现在我发现一些脚本确实需要特定的Ruby版本,不,它们不是可以在特定Ruby版本下部署的Rails应用程序。它们只是可以从命令行启动的单文件脚本,无法与系统版本一起工作


在运行文件的以下代码之前,有没有办法编写一个shebang,用rbenv/rvm设置环境?

rbenv将查找由设置的
.ruby version
文件(例如)

$rbenv本地1.9.3-p448
创建一个简单的文件,
check

#/usr/bin/env ruby
把RUBY_版本
使其可执行

$chmod+x检查
运行它

$。/检查
输出

1.9.3


也就是说,这不是每个文件的设置。如果有一种方法可以使用shebang来改变rbenv的行为,那可能更合适。

您不一定需要设置任何环境。您所需要的只是要运行的ruby二进制文件的路径,其他一切都将遵循该路径

下面是一个关于如何设置的示例:

  • 创建文件夹
    ~/bin
    。这将保存指向所有个人ruby二进制文件的指针(符号链接)

  • 更新shell
    路径
    ,以便可执行文件的搜索路径中包含
    ~/bin

  • ~/bin
    中所需的任何ruby二进制文件符号链接到实际的ruby二进制文件

  • 例如,在我的
    ~/bin
    中,我有:

    ruby18 -> /opt/ruby18/bin/ruby
    ruby19 -> /opt/ruby19/bin/ruby
    ruby20 -> /opt/ruby20/bin/ruby
    
    现在让我们假设您有一个需要1.9才能运行的脚本。那么你所需要做的就是:

    #!/usr/bin/env ruby19
    
    如果您已将gems安装到每个ruby可执行文件的默认gem目录中,那么这将起作用。如果您在其他地方安装了gems,那么它会变得更加复杂,您需要在运行脚本之前修改
    GEM_路径

    如果您不想对
    ~/bin
    感兴趣,那么只需对shebang行进行硬编码,直接指向ruby二进制:

    #!/opt/ruby19/bin/ruby
    
    …或等效的rbenv/rvm路径


    如果您编译了一个新的ruby 1.9补丁,并且希望将其放在另一个文件夹中,比如
    ~/bin
    ,那么在
    ~/bin
    中使用符号链接将允许您更轻松地更新bin指针。然后您只需更新
    ~/bin
    中的符号链接,您的所有脚本都将运行新的补丁版本。

    是的,但同意您目前的答案是解决方案的
    1/2
    。另一半正在编写一个启动器,使用这个或更好的ruby路径来启动目标脚本,然后将适当的rubyCD'ing放入目录,可能允许对
    ruby
    的本机调用来获取
    .rbenv版本
    文件。ruby版本(不是.rbenv版本)与您的工作目录无关,它基于脚本所在的目录。如果您将每个脚本与.ruby版本配对,那么您就可以了。否则,您可能必须按照Casper的建议,提供指向特定ruby版本的链接。因为shebang不能保证使用多个选项()您如何知道每个脚本需要什么ruby?这里似乎要么有查找问题,要么有文件组织问题需要解决。