shebang有多个版本

Sys*_*ank 5 ruby shebang rvm rbenv

在我的大量Ruby脚本集中,我用常见的shebang开始我的脚本:

#!/usr/bin/env ruby
Run Code Online (Sandbox Code Playgroud)

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

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

Cas*_*per 1

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

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

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

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

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

例如在我的~/bin我有:

ruby18 -> /opt/ruby18/bin/ruby
ruby19 -> /opt/ruby19/bin/ruby
ruby20 -> /opt/ruby20/bin/ruby
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/env ruby19
Run Code Online (Sandbox Code Playgroud)

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

如果你不想花哨,~/bin那么只需对 shebang 行进行硬编码,而不是直接指向 ruby​​ 二进制文件:

#!/opt/ruby19/bin/ruby
Run Code Online (Sandbox Code Playgroud)

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

如果您~/bin编译了 ruby​​ 1.9 的新补丁,并且您想将其放置在另一个文件夹(例如/opt/ruby19-p123. 然后您只需更新符号链接~/bin,所有脚本都将运行新的修补版本。