2011-03-28 74 views
1

从ruby控制台执行shell命令时获取权限被拒绝错误。 并且shell正在运行相同的shell命令。从ruby控制台执行shell命令返回权限被拒绝错误?

从壳牌..

[email protected]:~$ "`grep '^datadir=' /etc/mysql/my.cnf | cut -f 2 -d '='`/db_backups" 
bash: /db_backups: is a directory 
[email protected]:~$ 

从Ruby控制台..

>> %x["`grep '^datadir=' /etc/mysql/my.cnf | cut -f 2 -d '='`/db_backups"] 
sh: /db_backups: Permission denied 
=> "" 

任何想法!

+0

你确定你的例子来自shell实际上工作吗? 'bash:/ db_backups:是一个目录'肯定有一种错误信息的味道。你想达到什么目的?为什么整个命令在引号中? – sarnold 2011-03-28 05:56:45

回答

2

你试图执行一个目录,并且shell说不; bash通过说“/ db_backups:是一个目录”表示否,而sh表示“/ db_backups:权限被拒绝”。如果你只是执行backedticked部分:

grep '^datadir=' /etc/mysql/my.cnf | cut -f 2 -d '=' 

你几乎肯定会看到任何输出和原因可能是你的正则表达式是过于紧张,这样的事情:

grep '^[ ]*datadir[ ]*=' /etc/mysql/my.cnf | cut -f2 -d'=' 

会更好地为你服务;字符类包含一个空格和一个选项卡。

现在您正在寻找正确的事情,我们可以继续探讨为什么它仍然无法正常工作。 %x[] quoter尝试使用shell执行其参数。当你喂backticked grep的东西:

`grep '^[ ]*datadir[ ]*=' /etc/mysql/my.cnf | cut -f2 -d'='`/db_backups 

的外壳,你应该得到与/db_backups结尾的目录名,但你不能执行的目录。我想你想这个生产目录名称:

d = %x[echo `grep '^[ ]*datadir[ ]*=' /etc/mysql/my.cnf | cut -f2 -d'='`/db_backups].strip 

注意龙头echo.strip呼叫返回的字符串。需要.strip以从echo生成的新行中删除。

我认为你正在经历的东西很麻烦,可以很容易地使用Ruby的只是几行完成:

dir = nil 
File.open('/etc/mysql/my.cnf').each do |line| 
    if(m = line.match(/^\s*datadir\s*=\s*(\S+)/)) 
     dir = m[1] + '/db_backups' 
     break 
    end 
end 

你也许可以拧紧了一点,如果你想,但我认为这至少比在Ruby反引号中加入shell反引号更容易混淆。

+0

优秀的水晶球工作,以及很好的答案。 – sarnold 2011-03-28 08:40:05

+1

@sarnold:感谢邻居,西海岸最好的海岸。 – 2011-03-28 17:00:16

0

它看起来像你只是想从文件中获得字段2。然后在Ruby中使用拆分来做到这一点

File.open("file").each do |line| 
    if line[/^datadir/] 
    print line.split("=",2)[0] 
    end 
end 

没有必要专门去调用grep。这是效率低下,不可移植的