我有一个Rails脚本,我在OS X Lion和Debian GNU / Linux 7.0(wheezy)上运行。这是一个简单的脚本:
#!/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上失败,因为只是运行rails runner
就是shebang输出? FWIW,/ opt / thermyos.com/从Debian导出,并在OS X上安装NFS。
答案 0 :(得分:3)
这种情况正在发生,因为Linux上的shebang操作并没有拆分参数。
因此,env正在查找名称中包含空格的文件,即尝试执行没有参数的/opt/thermyos.com/server/script/rails runner
。
在OS X上,情况有所不同。 OS X中的shebang确实拆分了参数,因此env使用参数/opt/thermyos.com/server/script/rails
在runner
执行文件。
一种解决方法是使用包装脚本,例如表格
#!/bin/sh
exec /path/to/script/rails runner /path/to/your_script.rb
应适用于任何一种操作系统。 (路径是硬编码,计算,相对还是本地配置取决于您的具体情况)
答案 1 :(得分:3)
您可以在一个文件中执行此操作,而无需使用包装器。
创建一个ruby脚本并将其置于顶部:
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
答案 2 :(得分:0)
首先,env
是否存在于Debian框中的不同路径中? which env
会告诉你。
其次,我有点困惑。听起来你正在OS X和Debian机器上安装文件服务器,并试图在两个环境中运行该服务器上的Ruby可执行文件。确定无法正常工作 - 您需要为您的Debian / Linux系统编译Ruby,并为您的OS X系统编译另一个Ruby。
也许我在误读,但我想我会指出这一点。