シェバン以外にインタープリターを設定するものはありますか?

シェバン以外にインタープリターを設定するものはありますか?

私は別のスクリプト(rvm)をソースしようとするスクリプト(tmuxinator内)を実行しています。rvmはshからのソースを明示的に許可していません。tmuxinatorスクリプトのシェバンが次のようになっているので、これは問題にならないと思いました。

#!/bin/bash

しかし、スクリプトからrvmをソースするためにrvmの人々が提案したコードを挿入すると、

if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
  source "$HOME/.rvm/scripts/rvm"
fi

-わかりました

sh: 6: [[: not found

なぜそこでは sh がインタープリターとして使用されているのでしょうか? また、#!/usr/bin/zsh (スクリプトを呼び出した対話型シェルの $SHELL の値) と #!/usr/bin/env zsh も使用しましたが、同じエラーが発生します。

答え1

RVM は /bin/sh コンテキストで動作しますか? これが、この問題が発生する原因である可能性があります。ソース スクリプトは親のインタープリタを継承します。参照:http://ss64.com/bash/source.html

. (ソースまたはドット演算子)

ファイル名引数からコマンドを読み込んで実行する現在のシェルコンテキスト

(強調は筆者による)

答え2

問題はスクリプトがRubyから呼び出されたことにあるようです

exec(script)

また、exec は、呼び出されたスクリプトの shebang 行に関係なく、常に /bin/sh のコンテキストで動作します。

変更する

exec('/bin/bash', '-c', script)

動作します。

関連情報