2013-05-22 4 views
2

У меня есть сценарий Rails, который я запускаю как на OS X Lion, так и на Debian GNU/Linux 7.0 (wheezy). Это простой сценарий:Почему Rails бегун shebang не работает на Debian, но работает на OS X?

#!/usr/bin/env /opt/thermyos.com/server/script/rails runner 
ENV.each do |k, v| 
    puts "#{k} = #{v}" 
end 

Проблема заключается в/usr/bin/env. Этот скрипт, как показано, не будет запускаться на Debian, создавая ошибку /usr/bin/env: /opt/thermyos.com/server/script/rails runner: No such file or directory. В OS X он отлично работает, записывая среду Rails. Но если я удалю/usr/bin/env, поэтому shebang будет #!/opt/thermyos.com/server/script/rails runner, тогда он отлично работает на Debian, но не на OS X (Rails не загружен и поэтому каждая строка не работает). Неважно, где я запускаю сценарий или использую ли я относительный или абсолютный путь. Печатная среда почти идентична. Почему неудача на Debian, так как это именно вывод shebang, просто запустив rails runner? FWIW, /opt/thermyos.com/ экспортируется из Debian и NFS-смонтированных на OS X.

ответ

0

Во-первых, делает env живым по-другому на вашем поле Debian? which env расскажет вам.

Во-вторых, я несколько смущен. Похоже, вы монтируете файловый сервер как на своей ОС X, так и на своей машине Debian и пытаетесь запустить исполняемый файл Ruby на этом сервере в обеих средах. Довольно уверен, что это не сработает - вам понадобится Ruby для вашей системы Debian/Linux и еще один Ruby, скомпилированный для вашей системы OS X.

Возможно, я неправильно понял, но подумал, что я это укажу.

+0

Thank вы за ответ. Я проверил, что env находится в/usr/bin на обеих платформах. Нет файлового сервера. Каталог /opt/thermyos.com/ экспортируется из Debian и устанавливается на OS X, и на каждой платформе используется rvm для управления своими Rails. Исполнители живут в разных местах, но я ожидаю, что env предоставит соответствующие пути. Я ценю все, что вы можете указать, чтобы искать, поскольку у меня ничего нет. – RussK

2

Это происходит потому, что операция shebang в Linux не разделяет аргументы.

В результате, env ищет файл с пробелами в имени, т. Е. Пытается выполнить /opt/thermyos.com/server/script/rails runner без аргументов.

О OS X, ситуация отличается. Shebang в OS X разделяет аргументы, и поэтому env выполняет файл в /opt/thermyos.com/server/script/rails с аргументом runner.

Обходным способом является использование сценария-оболочки, например. форма

#!/bin/sh 
exec /path/to/script/rails runner /path/to/your_script.rb 

должно работать на обеих ОС. (независимо от того, являются ли пути жестко запрограммированными, рассчитанными, относительными или локально настроенными, зависит от ваших обстоятельств)

1

Вы можете сделать это в одном файле без использования обертки.

сделать рубиновый скрипт и поместить его в верхней части:

exec("/path/to/script/rails","runner",$0,*ARGV) unless defined?(Rails) 

Или:

exec("/usr/bin/env","rails","runner",$0,*ARGV) unless defined?(Rails) 

Больше информации и более нелепого решения доступны по адресу:

http://solutions.davesource.com/20161216.Shebang-That-Calls-Ruby-Rails-Script-With-Arguments.html

 Смежные вопросы

  • Нет связанных вопросов^_^