2012-11-12 2 views
5

루비의 system 메서드 here의 문서를 읽는 것이 매우 혼란 스럽습니다. 명령이란 무엇인지, 옵션은 무엇인지 확실하지 않습니다. 다음을 실행하려면 어떻게해야합니까?Ruby 시스템 메서드 인수

보안상의 이유로
wget -pk -nd -P /public/google www.google.com 

, 나는 예 고려

+1

backticks를 사용할 수 있습니다. – alex

+0

'파일 = 시스템 (wget -pk -nd -P/public/google www.google.com)'. 이것을 확인하십시오 http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby – nicooga

+0

죄송합니다, 제가 의미 한 바를 명확하게 편집했습니다. –

답변

10

(오히려 처음보다, 내가 준 URL에서 두 번째와 세 번째 형태)에는 쉘을 사용하지 않는 버전 중 하나를 사용하고 싶습니다 :

system("echo *") 
system("echo", "*") 

는 첫번째 파싱 및 실행되는 쉘 문자열 'echo *' 전달; 그래서 system('echo *')은 쉘 프롬프트에서 echo *이라고 말하는 것과 같은 출력을내는 이유입니다. 현재 디렉토리에있는 파일 목록을 얻습니다. 해당 인수 형태이다

commandline : command line string which is passed to the standard shell 

두 번째는 완전히 무시 쉘. PATH에서 echo을 찾은 다음 문자열로 '*'을 인수로 사용하여 실행합니다. 셸이 와일드 카드를 확장하기 때문에 (적어도 unixy 시스템에서는) *은 단순한 *으로 유지되며 출력으로는 *이 표시됩니다. 해당 인수의 형태는 여기에 있습니다 :

cmdname, arg1, ... : command name and one or more arguments (no shell) 

세 번째 형태 : 당신이 cmdname을 실행하고자하지만 ps 목록과 같은에서 다른 이름으로 표시가있을 때

[cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell) 

사용됩니다. 두 개의 터미널을 열어이를 실제로 볼 수 있습니다. 그들 중 하나에 irb을 열고 말 :

system('sleep', '10') 

는 신속하게 다른 전환하고 ps 목록을 확인합니다. 거기에 sleep 10이 표시되어야합니다. 당신이 pancakes 10를 볼 수 있습니다,

system(['sleep', 'pancakes'], '10') 

을하고 ps 목록을 확인합니다, 당신은 irb이를 제공합니다. system('sleep 10')라고 말하면 비슷한 two-terminal 트릭을 통해 shell -c sleep 10이 표시됩니다.

첫 번째 인수로 해시를 제공하면 해당 해시가 생성 된 프로세스의 환경 변수로 사용됩니다. 해시를 마지막 인수로 제공하면 해당 해시가 옵션으로 사용됩니다. 인수에 대한 자세한 내용은 system 설명서에 명시된 바와 같이 Kernel#spawn에서 확인할 수 있습니다.

+0

오랫동안 답변 해 주셔서 감사합니다! 내가 아직도 확실하지 않은 것은 "논쟁"으로 간주되는 것입니다.'-pk','-nd','-P','/ public/google','www.google.com'은 하나의 인수로 간주됩니까? –

+0

@MikaH : 예, 각각 논증입니다. –