Ruby script: shebang с абсолютным путем к рубину не работает

Я использую Mac OS X. У меня установлены две версии Ruby (2.1.5 и 2.0.0). Первый установлен в /another/.path/to/ruby (перед словом «путь» стоит точка, чтобы имитировать тот факт, что путь содержит промежуточный каталог с точками), в дополнение к системному каталогу по умолчанию (версия 2.0. 0) в / usr / bin / ruby. Я использовал rbenv для установки Ruby.

После того, как я вручную установил переменную среды PATH, чтобы команда ruby ​​по умолчанию была найдена в другом каталоге: /another/.path/to/ruby. Сейчас проверяю

which -a ruby

Сначала в качестве вывода используется правильный рубин.

/another/.path/to/ruby
/usr/bin/ruby

Теперь я создаю сценарий rbs с первой строкой shebang, определяющей используемый рубин.

#!/usr/bin/env ruby
puts 'hey there'

Тогда я бегу

./rbs

он выводит «привет». Хорошо. Между тем, Ruby использует правильную версию.

/usr/bin/env ruby --version

а также

ruby --version

оба выхода 2.1.5. Так что использование новой версии делает отличную работу.

Однако здесь возникает проблема: теперь я обновляю файл rbs, чтобы он был:

#!/another/.path/to/ruby
puts 'hey there'

Обратите внимание, что я обновил shebang, чтобы использовать абсолютный путь к желаемому рубину. тогда я бегу

./rbs

Он выводит:

./rbs: line 2: puts: command not found

что слишком странно;

но если я убегу

ruby ./rbs

он выводит «привет, там» как обычно. Похоже, что shebang отлично работает с / usr / bin / env ruby, но не для абсолютного пути для вновь установленного ruby?

Почему это? Есть ли способ исправить это, чтобы обновленный скрипт мог работать, набрав следующее?

./rbs

Спасибо!


person Bruce    schedule 07.01.2015    source источник
comment
Что ./rubyscript в вашем ./rbs выводе?   -  person Wenbing Li    schedule 07.01.2015
comment
Извините, опечатка. Буду обновлять. Это просто файл ./rbs.   -  person Bruce    schedule 07.01.2015
comment
/another/.path/to/ruby rbs работает?   -  person roob    schedule 07.01.2015


Ответы (2)


Сообщение puts: command not found указывает, что ваш скрипт запускается не Ruby, а оболочкой. Итак, сначала я бы дважды проверил синтаксис и путь вашей строки shebang.

Во-вторых, обратите внимание, что rbenv использует оболочки, которые динамически находят и запускают нужную версию ruby (и связанных программ, таких как gem и т. Д.). Но прокладки - это скрипты, а скрипты сами по себе не могут быть интерпретаторами; вам нужно найти и использовать фактический путь к исполняемому файлу ruby ​​(как вывод rbenv which ruby).

С другой стороны, поскольку /usr/bin/env исполняемый файл, вы всегда можете использовать что-то вроде #!/usr/bin/env ruby, которое будет работать, даже если ruby, который он найдет в пути, сам является сценарием.

person Mark Reed    schedule 07.01.2015
comment
Это отличный ответ! Спасибо, Марк. Ваше мнение о том, что прокладки - это сценарии, которые сами по себе не могут быть интерпретаторами shebang, имеет смысл. - person Bruce; 07.01.2015

Я не могу комментировать (иначе я бы добавил в качестве комментария), но я думаю, что стоит добавить, что

#!/usr/bin/env ruby

ДОЛЖНА быть первой строкой файла. Это меня на время сбило с толку.

источник

person Gabriel    schedule 02.04.2019