你试图执行一个目录,并且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反引号更容易混淆。
你确定你的例子来自shell实际上工作吗? 'bash:/ db_backups:是一个目录'肯定有一种错误信息的味道。你想达到什么目的?为什么整个命令在引号中? – sarnold 2011-03-28 05:56:45