在可执行文件中,您可以使用 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 ruby
using而不是 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 cat
、grep
、sed
以及ruby
,那么当您设置时PATH=/usr/local/bin:$PATH
,您将获得 BSD 可执行文件而不是 Linux 可执行文件。这可能会出现问题。