Вы пытаетесь выполнить каталог, а оболочки говорят «нет»;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[]
пытается выполнить свой аргумент с помощью оболочки.Когда вы передаете обратно в оболочку 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.