2010-06-03 3 views
4

Ruby에서 원래 명령 줄 인수 문자열에 액세스하려고합니다 (즉, 미리 분할되거나 분리 된 ARGV 배열을 사용하지 않음). 누구든지이 작업을 수행하는 방법을 알고 있습니까? 예를 들어 :Ruby에서 원래 명령 줄 인수 문자열에 액세스하는 방법?

"command \"line\" arguments" 

모든 팁을 :

$> ruby test.rb command "line" arguments 

나는 '선'이 따옴표가 있다면 말할 수있을까요? 미리 감사드립니다.

답변

6

내가 알 수있는 한, 루비는 명령 줄에서 큰 따옴표를 제거하지 않습니다. 쉘은 내용을 문자열로 보간하고이를 루비에 전달하기 위해이를 사용하고 있습니다.

당신은 루비 이렇게 받아 모든 것을 얻을 수 있습니다 :

cmd_line = "#{$0} #{ARGV.join(' ')}" 

을 왜 따옴표로 무엇을 알아야합니까? 다른 구분 기호 (':'또는 '#'와 같은)를 사용할 수 있습니까?

당신은, 당신이 그들을 이스케이프 루비 따옴표를 전달할 수 있습니다해야하는 경우 :

$> ruby test.rb command "\"line\"" arguments 

이 경우에 다음 문자열받을 위 cmd_line 변수 :

test.rb comand "line" arguments 
+0

내가 다음 –

+0

사용 '탈출'보석을 얻을 수있는이 가까운 것 같다. – ciastek

2

저는 그것이 프로그램에 전달되기 전에 쉘에 의해 다뤄지는 것으로 알고 있습니다.

2

Unix 시스템에서 명령 행 쉘 (Bash, csh 등)은 자동으로 이러한 구문을 인수 문자열로 변환하여 Ruby 실행 파일로 보냅니다. 예를 들어, *는 디렉토리의 각 파일로 자동 확장됩니다. 이 문제를 감지 할 수있는 방법이 있는지 의심스럽고, 왜 그렇게하고 싶은지 묻습니다.

0

이 정상적으로를 도움 :

cmdline = ARGV.map{|x| x.index(/\s/) ? "\"#{x}\"":x}.join " " 

따옴표 안에 단어가 있기 때문에 쉘 int o 하나의 인자, 각 인자가 공백을 가지고 있는지 검사 할 필요가있다.

여전히 와일드 카드 (*), env 변수 ($ VAR) 및 쉘에서 스크립트로 전달하기 전에 확장되는 기타 항목은 유지되지 않습니다.

것은 그대로 확장하지 않고 명령을 통과 할 수 있으려면 echo "ls *" | my_script.rb