为什么Rails的跑步者shebang不能在Debian上工作但是在OS X上工作?

时间:2013-05-22 18:26:29

标签: ruby-on-rails ruby shebang

我有一个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。

3 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为Linux上的shebang操作并没有拆分参数。

因此,env正在查找名称中包含空格的文件,即尝试执行没有参数的/opt/thermyos.com/server/script/rails runner

在OS X上,情况有所不同。 OS X中的shebang确实拆分了参数,因此env使用参数/opt/thermyos.com/server/script/railsrunner执行文件。

一种解决方法是使用包装脚本,例如表格

#!/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。

也许我在误读,但我想我会指出这一点。