如何指定替代脚本解释器 (shebangs)?

如何指定替代脚本解释器 (shebangs)?

在可执行文件中,您可以使用 shebang 指定环境:

#!/usr/bin/env ruby

# ruby code here

但是如果您想指定多个可能的环境怎么办?例如,如果您安装了多个版本的 Ruby,您可能需要执行类似的操作

#!/path/to/better/ruby/version
#!/path/to/alternative/ruby/version

# ruby code here

如何为单个可执行文件指定多个可能的环境?

答案1

简短的回答是你不能。

#!/usr/bin/env rubyusing而不是 simple背后的想法#!/usr/bin/ruby是使用用户路径中第一个的任何 ruby​​ 二进制文件。那么你的脚本并不依赖于每个系统上的 ruby​​ 都位于同一个位置;毕竟,“正常”红宝石位置可能是、、、/usr/bin/ruby等等....../usr/local/bin/ruby/opt/ruby-1.8.7/bin/ruby

如果您确实想要硬编码某些值或执行一些搜索逻辑,您始终可以制作一个包装器 shell 脚本:

#!/bin/sh

for ruby in /usr/bin/ruby /usr/local/bin/ruby
do
    if [ -x "$ruby" ]
    then
        "$ruby" myscript.rb
        break
    fi
done

如果你有足够的动力,你甚至可以嵌入 ruby​​(或其他)脚本在 shell 脚本里面。

答案2

我要反驳 mrb 并说你可以做替代方案,没有更改“#!”线。

假设您有一个 ruby​​ 脚本,#!/usr/bin/env ruby第一行为。

/path/to/better/ruby/version/whatever运行该脚本,请先设置 PATH 环境变量/path/to/better/ruby/version

PATH=/path/to/better/ruby/version:$PATH  whatever_script_name_is

你想/usr/local/bin/ruby运行脚本吗?适当设置 PATH:

PATH=/usr/local/bin:$PATH  whatever_script_name_is

请注意,如果您要运行脚本的 ruby​​ 可执行文件位于与 PATH 相同的目录中,则摆弄 PATH 可能会导致其他问题其他替代程序。例如,如果其中/usr/local/bin有 BSD catgrepsed以及ruby,那么当您设置时PATH=/usr/local/bin:$PATH,您将获得 BSD 可执行文件而不是 Linux 可执行文件。这可能会出现问题。

相关内容