Отсутствующие результаты от grep call с фигурными скобками в параметрах, выполненных из Ruby - PullRequest
0 голосов
/ 30 августа 2011

Я не получаю результаты от grep, когда я вызываю его с параметром, содержащим фигурные скобки, используя выражения `` или% x {} Руби.

Скажем, у меня есть эти файлы в пустой директории:

$ echo '**hello**' > hello.md
$ echo 'hello' > hello.txt

Если я хочу, чтобы результаты соответствовали только одному расширению, Ruby работает должным образом:

$ grep -rn hello . --include=*.txt
./hello.txt:1:hello

$ grep -rn hello . --include=*.md
./hello.md:1:**hello**

$ irb

ree-1.8.7-2011.03 :001 > `grep -rn hello . --include=*.txt`
=> "./hello.txt:1:hello\n"

ree-1.8.7-2011.03 :002 > %x{grep -rn hello . --include=*.md}
=> "./hello.md:1:**hello**\n" 

ree-1.8.7-2011.03 :003 > exit

Но если я запрашиваю результаты, соответствующие любому расширению, с использованием синтаксиса фигурных скобок grep, результаты не приходятс Ruby:

$ grep -rn hello . --include=*.{txt,md}
./hello.txt:1:hello
./hello.md:1:**hello**

$ irb

ree-1.8.7-2011.03 :001 > `grep -rn hello . --include=*.{txt,md}`
=> ""

ree-1.8.7-2011.03 :002 > %x{grep -rn hello . --include=*.{txt,md}}
=> ""

Редактировать: эхо работает, но результаты команды все еще пусты:

ruby-1.9.2-p180 :004 > `echo grep -rn hello . --include=*.{txt,md}`
=> "grep -rn hello . --include=*.{txt,md}\n" 

ruby-1.9.2-p180 :005 > `grep -rn hello . --include=*.{txt,md}`
=> "" 

Как я могу отладить это и увидеть фактическую команду, которая выполняется?И как правильно выполнять системные команды с помощью фигурных скобок в параметрах из Ruby?

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Вот предположение: %x{} использует /bin/sh, который не ведет себя как /bin/bash (или ваша обычная оболочка).

Этот шаблон:

*.{txt,md}

расширяется вашей оболочкой так же, как и все остальные шаблоны файловых глобингов.Когда вы запускаете команду из irb, Ruby, вероятно, использует /bin/sh для выполнения команды, и в вашей системе /bin/sh ведет себя как обычная оболочка POSIX, которая не понимает синтаксис глобализации *.{a,b}.

Попробуйте вызвать bash напрямую:

irb> `bash -c 'grep -rn hello . --include=*.{txt,md}'`
0 голосов
/ 30 августа 2011

пытались ли вы вырваться из своих фигурных скобок, т.е.

...