2011-08-30 2 views
0

Ruby의``또는 % x {} 표현식을 사용하여 중괄호를 포함하는 param을 호출하면 grep에서 결과를 얻지 못합니다.Ruby에서 실행 된 params에 중괄호를 사용하여 grep 호출 결과가 누락되었습니다.

$ 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 

하지만 결과 일치에 요구하는 경우 :

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

나는 단지 하나의 확장자와 일치하는 결과를 원하는 경우, 루비가 예상대로 작동합니다

내가 빈 디렉토리에이 파일을 말해봐 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의 매개 변수에서 중괄호를 사용하여 시스템 명령을 실행하는 올바른 방법은 무엇입니까?

+0

내가 MRI 1.9.2에 그리고 난이 문제가없는 것을 확인할 수 있습니다. 간단히'% x {echo a {b, c} d}'또는 비슷한 것을 실행하면 예상 결과를 볼 수 있습니까? 대괄호를 이스케이프하는 단일 백 스페이스는 나를 위해 작동합니다. – numbers1311407

+0

나는 원래 1.9.2에서이 이상 함을 발견했다; 그 결과로 편집 된 질문. –

답변

1

%x{}/bin/sh을 사용하고 있습니다. 이것은 /bin/bash (또는 일반적인 쉘)처럼 동작하지 않습니다.

이 패턴 :

*.{txt,md} 

단지 다른 모든 파일 글 로빙 패턴처럼 쉘에 의해 확장됩니다. irb에서 명령을 실행할 때 Ruby는 아마도 /bin/sh을 사용하여 명령을 실행하고 /bin/sh*.{a,b} globbing 구문을 이해하지 못하는 일반 POSIX 셸처럼 작동합니다.

에 한번 직접 bash를 호출 :

irb> `bash -c 'grep -rn hello . --include=*.{txt,md}'` 
+0

감사합니다 뮤, 그랬어! –

0

중괄호를 이스케이프 처리 했습니까? 예 : { ->\{이 항목을 지금 확인할 수 없다면 잘못되었지만 이스케이프해야 할 수 있습니다.

관련 문제