web-dev-qa-db-ja.com

代替のスクリプトインタープリター(シバン)をどのように指定しますか?

実行可能ファイルでは、Shebangを使用して環境を指定します。

#!/usr/bin/env Ruby

# Ruby code here

しかし、複数の可能な環境を指定したい場合はどうでしょうか。たとえば、Rubyの複数のバージョンがインストールされている場合は、次のようなことを行うことができます。

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

# Ruby code here

1つの実行可能ファイルに対して複数の可能な環境をどのように指定できますか?

8
sffc

簡単に言えば、あなたはできないということです。

単に#!/usr/bin/env Rubyの代わりに#!/usr/bin/Rubyを使用する背後にある考え方は、ユーザーのパスの最初にあるRubyバイナリを使用することです。その場合、スクリプトはRubyがすべてのシステムの同じ場所にあることに依存しません。結局のところ、「通常の」Rubyの場所は/usr/bin/Ruby/usr/local/bin/Ruby/opt/Ruby-1.8.7/bin/Rubyなどである可能性があります。

DIDで値をハードコーディングしたり、検索ロジックを実行したりする場合は、いつでもラッパーシェルスクリプトを作成できます。

#!/bin/sh

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

また、十分な意欲があれば、シェルスクリプト内に Ruby(またはその他の)スクリプトを埋め込む も可能です。

6
mrb

私はmrbと矛盾し、代替を行うことができると言いますなし「#!」を変更しますライン。

最初の行に#!/usr/bin/env Rubyを含む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実行可能ファイルがother代替プログラムと同じディレクトリにある場合、PATHをいじると他の問題が発生する可能性があることに注意してください。たとえば、/usr/local/binにBSDcatgrepsedRubyが含まれている場合、PATH=/usr/local/bin:$PATHを設定するとLinux実行可能ファイルの代わりにBSD実行可能ファイルを取得します。これにより、問題が発生する可能性があります。

1
Bruce Ediger