Отсутствуют результаты вызова grep с фигурными скобками в параметрах, выполненных из Ruby.

Я не получаю результатов от grep, когда вызываю его с параметром, содержащим фигурные скобки, используя выражения Ruby `` или %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?


person Gabe Kopley    schedule 30.08.2011    source источник
comment
Я на мрт 1.9.2 и могу подтвердить, что у меня нет этой проблемы. Если вы запустите просто %x{echo a{b,c}d} или что-то подобное, вы увидите ожидаемый результат? У меня также работает одиночный пробел, выходящий за скобки.   -  person numbers1311407    schedule 30.08.2011
comment
Первоначально я обнаружил эту странность на 1.9.2; отредактированный вопрос с этими результатами.   -  person Gabe Kopley    schedule 30.08.2011


Ответы (2)


Вот предположение: %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}'`
person mu is too short    schedule 30.08.2011

Вы пытались избежать своих фигурных скобок, т. Е. {-> \{, не имея возможности проверить это прямо сейчас, я могу ошибаться, но, возможно, их нужно экранировать.

person smitec    schedule 30.08.2011