0

Ubuntu 12.04

西纳特拉 1.3.3

为什么将参数传递给 ruby​​ 系统调用(%x[] 或 ``)会在我的 sinatra 应用程序中给我一个“未找到”错误?相同的代码在从同一目录运行的普通 ruby​​ 脚本中运行良好。

我有一个像这样的文件 test.rb

output = %x["ls"] 
p output

当我使用“ruby test.rb”运行它时,我得到了控制台中当前目录的内容,正如预期的那样。

如果我修改程序以向系统调用提供参数,如下所示:

output = %x["ls sub_dir/"] 
p output

正如预期的那样,我得到了位于当前目录中的 sub_dir 的内容。

到现在为止还挺好。

现在,如果我使用 post 方法制作 Sintra 应用程序:

require 'rubygems'
require 'bundler/setup'
require 'sinatra'

post "/" do
 output = x["ls"]
 return output
end

对“/”的 Post 调用的响应按预期返回当前目录的内容,其中包括“sub_dir”。

如果我尝试将参数添加到 sinatra 应用程序的系统调用中,如下所示:

require 'rubygems'
require 'bundler/setup'
require 'sinatra'

post "/" do
 output = x["ls sub_dir/"]
 return output
end

响应为 nil,控制台中出现错误:

sh: 1: ls sub_dir/: 未找到

为什么在我的 sinatra 应用程序中向系统调用添加参数会导致它崩溃,当从普通 ruby​​ 脚本调用的相同代码从相同位置运行时运行良好。

顺便说一句,这里显示的“ls”示例不是我真正需要运行的命令,所以请不要解释获取此信息的不同方式。我有一个可执行文件,它将文件名作为我需要运行的参数,其行为方式完全相同。

提前致谢!

4

2 回答 2

1

如果要指定与应用程序相关的路径,可以使用如下内容:

post "/" do
 path = File.join(File.dirname(__FILE__), "sub_dir")
 %x[ls #{path}]
end

然而,如果你想列出一个目录的内容,为什么不在 Ruby 中做呢?

于 2012-11-03T10:48:51.443 回答
0

我在同一目录中的另一个文件中重写了 sinatra 应用程序。

一切都按预期工作。

我没有找到原因,我删除了原始文件,这样我就不会再浪费时间试图弄清楚了。

于 2012-11-04T05:52:37.377 回答