может ли что-то кроме шебанга установить интерпретатор?

может ли что-то кроме шебанга установить интерпретатор?

Я запускаю скрипт (в tmuxinator), который пытается получить исходный код другого скрипта (rvm). 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 всегда работает в контексте /bin/sh, несмотря на строку shebang в вызванном скрипте.

Изменение на

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

работает.

Связанный контент