
Я запускаю скрипт (в 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)
работает.