shebang有多个版本

时间:2013-11-25 21:47:34

标签: ruby rvm rbenv shebang

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

#!/usr/bin/env ruby

现在我发现一些需要某些Ruby版本的脚本,不,它们不是可以在特定Ruby版本下部署的Rails应用程序。它们只是单个文件脚本,可以从命令行启动,无法使用系统版本。

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

2 个答案:

答案 0 :(得分:1)

rbenv将查找由(例如)

设置的.ruby-version文件
$ rbenv local 1.9.3-p448

创建一个简单文件check

#!/usr/bin/env ruby
puts RUBY_VERSION

使其可执行

$ chmod +x check

运行它

$ ./check

输出

1.9.3

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

答案 1 :(得分:1)

您不一定需要设置任何环境。您所需要的只是您想要运行的ruby二进制文件的路径以及其他所有内容。

以下是有关如何设置的示例:

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

  2. 更新您的shell PATH,以便~/bin包含在可执行文件的搜索路径中。

  3. ~/bin中需要的任何ruby二进制文件符号链接到实际的ruby二进制文件。

  4. 例如,在我的~/bin我有:

    ruby18 -> /opt/ruby18/bin/ruby
    ruby19 -> /opt/ruby19/bin/ruby
    ruby20 -> /opt/ruby20/bin/ruby
    

    现在假设您有一个需要1.9才能运行的脚本。那么你需要做的就是:

    #!/usr/bin/env ruby19
    

    如果您已将gem安装到每个ruby可执行文件的默认gem目录中,这将有效。如果您在其他地方安装了gem,那么它会变得更复杂,您需要在运行脚本之前修改GEM_PATH

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

    #!/opt/ruby19/bin/ruby
    

    ...或等效的rbenv / rvm路径。

    在你的~/bin中使用符号链接可以让你更轻松地更新你的bin指针,如果我们说你编译一个新的ruby 1.9补丁,你想把它放在另一个文件夹,如/opt/ruby19-p123 。然后,您只需要更新~/bin中的符号链接,所有脚本都将运行新的修补版本。