从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
=> ""
任何想法!
答案 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
。这是低效且不便携的