ruby 脚本中的 `#!`(shebang)(hashbang) 有问题
Something is wrong with `#!`(shebang)(hashbang) in ruby script
我有一个 ruby 脚本,内容如下:
#!/data1/thirdparty/ruby/bin/ruby -I/data1/thirdparty/ruby/lib/ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/gems/2.0.0/gems/ruby-net-ldap-0.0.4 -I/data1/thirdparty/ruby/lib/ruby/site_ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/2.0.0/i686-linux
当我 运行 脚本时,它抛出以下错误:
<internal:gem_prelude>:1:in `require': cannot load such file -- rubygems.rb (LoadError)
from <internal:gem_prelude>:1:in `<compiled>'
我对程序进行了strace,在strace中发现了这个:
open("/data1/thirdparty/ruby/lib/ruby/2.0.0 -I/data1/thirdparty/enc/encdb.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
所以似乎 ruby 无法正确处理 -I
因为它将它包含在文件路径本身中。如何强制脚本使用 -I
作为包含路径指令?
我会使用 rvm 和捆绑器。然后,您可以使用 rvm-wrapper 调用您的脚本(例如,如果 运行 在 cron 作业中),或使用 bundle exec
进行开发。您需要配置好 *.gemspec
(例如 运行 bundle new mygem
并查看 mygem.gemspec
)。
另一种可能性是编写一个 shell 脚本,包括
/data1/thirdparty/ruby/bin/ruby -I/data1/thirdparty/ruby/lib/ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/gems/2.0.0/gems/ruby-net-ldap-0.0.4 -I/data1/thirdparty/ruby/lib/ruby/site_ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/2.0.0/i686-linux <yourfile.rb>
.
顺便说一句。 #!
行称为 shebang 或 hashbang,如果您想研究发生了什么。
试试这个:
#!/bin/bash
exec /data1/thirdparty/ruby/bin/ruby -I/data1/thirdparty/ruby/lib/ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/gems/2.0.0/gems/ruby-net-ldap-0.0.4 -I/data1/thirdparty/ruby/lib/ruby/site_ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/2.0.0/i686-linux -x "[=10=]" "$@"
#!ruby
p "this is my ruby code"
我有一个 ruby 脚本,内容如下:
#!/data1/thirdparty/ruby/bin/ruby -I/data1/thirdparty/ruby/lib/ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/gems/2.0.0/gems/ruby-net-ldap-0.0.4 -I/data1/thirdparty/ruby/lib/ruby/site_ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/2.0.0/i686-linux
当我 运行 脚本时,它抛出以下错误:
<internal:gem_prelude>:1:in `require': cannot load such file -- rubygems.rb (LoadError)
from <internal:gem_prelude>:1:in `<compiled>'
我对程序进行了strace,在strace中发现了这个:
open("/data1/thirdparty/ruby/lib/ruby/2.0.0 -I/data1/thirdparty/enc/encdb.so", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
所以似乎 ruby 无法正确处理 -I
因为它将它包含在文件路径本身中。如何强制脚本使用 -I
作为包含路径指令?
我会使用 rvm 和捆绑器。然后,您可以使用 rvm-wrapper 调用您的脚本(例如,如果 运行 在 cron 作业中),或使用 bundle exec
进行开发。您需要配置好 *.gemspec
(例如 运行 bundle new mygem
并查看 mygem.gemspec
)。
另一种可能性是编写一个 shell 脚本,包括
/data1/thirdparty/ruby/bin/ruby -I/data1/thirdparty/ruby/lib/ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/gems/2.0.0/gems/ruby-net-ldap-0.0.4 -I/data1/thirdparty/ruby/lib/ruby/site_ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/2.0.0/i686-linux <yourfile.rb>
.
顺便说一句。 #!
行称为 shebang 或 hashbang,如果您想研究发生了什么。
试试这个:
#!/bin/bash
exec /data1/thirdparty/ruby/bin/ruby -I/data1/thirdparty/ruby/lib/ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/gems/2.0.0/gems/ruby-net-ldap-0.0.4 -I/data1/thirdparty/ruby/lib/ruby/site_ruby/2.0.0 -I/data1/thirdparty/ruby/lib/ruby/2.0.0/i686-linux -x "[=10=]" "$@"
#!ruby
p "this is my ruby code"