2015-01-07 7 views
1

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

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

which -a ruby 

Он использует правильный рубин во-первых, как выход.

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

Теперь я создать сценарий, Р.Б.С., с первой линией притона с указанием рубина использовать.

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

Тогда я бегу

./rbs 

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

/usr/bin/env ruby --version 

, а также

ruby --version 

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

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

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

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

./rbs 

Он выдает:

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

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

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

ruby ./rbs 

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

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

./rbs 

Спасибо!

+0

Что такое './Rubyscript' в вашем'./Rbs' выходе? –

+0

Извините, опечатка. Я обновлю его. Это просто файл ./rbs. – Bruce

+1

Работает ли '/another/.path/to/ruby rbs'? – roob

ответ

6

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

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

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

+0

Это отличный ответ! Спасибо, Марк. Ваша точка зрения, что прокладки - это сценарии, которые сами по себе не могут быть интерпретаторами shebang, имеют прекрасный смысл. – Bruce