Выполнение команды оболочки из консоли ruby, возвращающей ошибку «Отказано в доступе»? - PullRequest
1 голос
/ 28 марта 2011

Ошибка получения разрешения запрещена при выполнении команды оболочки из консоли ruby. И та же команда оболочки работает из оболочки.

из ракушки ..

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 ​​..

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

Любая идея!

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Вы пытаетесь выполнить каталог, а оболочки говорят «нет»;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.

0 голосов
/ 28 марта 2011

Похоже, вы просто хотите получить поле 2 из файла.Затем просто сделайте это в Ruby, используя split

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

. Нет необходимости специально выделять оболочку для вызова grep.Это неэффективно и непереносимо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...