5

我有一个在 OS X Lion 和 Debian GNU/Linux 7.0 (wheezy) 上运行的 Rails 脚本。它归结为一个简单的脚本:

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

4

3 回答 3

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

应该可以在任一操作系统上运行。(路径是硬编码的、计算的、相对的还是本地配置的取决于您的情况)

于 2015-01-08T02:40:02.350 回答
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

于 2016-12-17T02:51:07.803 回答
0

首先,env在您的 Debian 机器上是否存在不同的路径?which env会告诉你。

其次,我有些困惑。听起来您在 OS X 和 Debian 机器上都安装了文件服务器,并试图在这两种环境中的服务器上运行 Ruby 可执行文件。很确定这不会起作用 - 你需要为你的 Debian/Linux 系统编译 Ruby 并为你的 OS X 系统编译另一个 Ruby。

也许我看错了,但我想我会指出这一点。

于 2013-05-23T04:36:44.797 回答