从ruby控制台执行shell命令返回Permission Denied Error?

时间:2011-03-28 05:52:54

标签: ruby-on-rails ruby shell

从ruby控制台执行shell命令时获取权限被拒绝错误。 而shell的命令也是一样的。

来自壳牌..

tests@tests-workstation:~$ "`grep '^datadir=' /etc/mysql/my.cnf | cut -f 2 -d '='`/db_backups"
bash: /db_backups: is a directory
tests@tests-workstation:~$

来自ruby console ..

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

任何想法!

2 个答案:

答案 0 :(得分:2)

你正在尝试执行一个目录而shell正在说不; bash说“/ db_backups:是一个目录”,而sh表示“/ db_backups:权限被拒绝”。如果您只是执行后悔部分:

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

你几乎肯定看不到任何输出,原因可能是你的正则表达式过于紧张,如下所示:

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

会更好地为你服务;字符类包含空格和制表符。

现在你正在寻找合适的东西,我们可以继续讨论为什么它仍然无效。 %x[]引用尝试使用shell执行其参数。当您提供反向grep的东西时:

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

到shell,你应该得到一个以/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反对更容易让人困惑。

答案 1 :(得分:0)

看起来你只想从文件中获取字段2。然后使用split

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

没有必要专门打电话给grep。这是低效且不便携的

相关问题