2012-04-30 2 views
3

저는 매우 기본적인 질문이 있습니다. Linux에서 디렉토리 내용에 액세스하는 Ruby 스크립트를 실행하고 있습니다. 디렉토리는 루비 스크립트가 실행될 때 명령 행을 통해 전달됩니다.Ruby 스크립트에서 쉘 스크립트 명령 실행

제 질문은 루비 명령에 명령 줄 인수를 어떻게 사용합니까?

usrDirectory = ARGV[0] 
lsCmd = `ls -l` 

내가 usrDirectory -l LS 같은 것을 사용해야합니다

나는 같은과 같은 설정이있다. 그냥 같은 명령에 삽입 할 수 있을까요?

답변

2

위의 권리이며, 당신이 밖으로 표준 ls 출력을하려면,이 그것을 조금 청소기를 만드는 :

system("ls", "-l", dir) 

이렇게하면 Ruby는 위와 같이 출력에 변수를 출력하는 대신 출력을 표준 출력으로 출력합니다.

+3

'system'을 사용한다면 다중 인수 버전을 사용해야합니다 :'system ('ls', '-l', dir)' –

+0

오오. 나는 그것을 바꿀 것이다. 나를 상기시켜 줘서 고마워. – Linuxios

0

당신은 표현의 확장을 사용하여 명령 문자열의 시퀀스를 탈출 할 수

lsCmd = `ls -l #{usrDirectory}` 
0

두 가지 옵션이 있습니다. 당신은 할 수 있습니다 :

lsCmd = `ls -l #{usrDirectory}` 

또는

command = "ls -l " + usrDirectory 
lsCmd = %x[ #{command} ] 
1

당신은 예를 들어, 쉘을 사용하지 않고 당신이 원하는 것을 얻을 수 있어야합니다 :

상관없이 당신이 무엇
usr_dir = "/tmp" 
files = Dir["#{usr_dir}/*"] 

p files 

, 수 매우 조심하십시오 사용자가 입력 한 텍스트를 구문 분석하여 실행될 내용의 일부로 셸로 전달할 때 매우주의하십시오. 예를 들어, 어떤 사용자가

(대신 디렉토리 이름의) 입력하면 어떻게, RF RM은/*

?

+1

그 이유는 이러한 명령의 다중 인수 버전을 사용하기 때문에 쉘을 우회하여 인수를 프로그램 인수로 직접 사용하기 때문입니다. – Linuxios

+0

예, 요점은 셸이 구문 분석하지 못하게하는 것입니다. 너무 많은 힘. – theglauber

+0

정확히. 나는 우리가 동의 할 것이라고 확신한다. – Linuxios

관련 문제