2013-07-29 12 views
4

프랭크를 사용하여 iOS 테스트를하고 있습니다. 오이를 사용하는 루비 보석입니다. 앱 실행 여부 또는 충돌 여부를 확인하는 "감안할"단계가 있습니다. 내 단계에서 응용 프로그램을 다시 시작하고 싶습니다. 내가 오이 .feature 파일 근처에 저장되어있는 쉘 스크립트를 사용하여 응용 프로그램을 시작합니다.루비에서 쉘 스크립트를 실행하십시오.

해당 단계 정의에서 스크립트를 어떻게 호출 할 수 있습니까?

답변

3

당신은 루비에서 쉘 스크립트를 실행하는 여러 가지 방법이 있습니다,이 몇 가지 방법

Kernel.system "command" 
%x[command] 
`command` 
+0

그건 그렇고,'Kernel '은 필요 없다. 해당 모듈은 기본적으로 Object에 이미 포함되어 있습니다. 아니면 그런 식으로. – Jwosty

+2

네, 같은 이름의 로컬 메소드가 없다면,'Kernel' 접두사는 중복되지만, 문서를 찾는 것과 관련이 있습니다. 사방에 나타나는 마법의 방법은 대개 Kernel에 있습니다. – tadman

+0

@tadman이 말한 정확한 이유 때문에 항상 네임 스페이스를 사용하는 것이 좋습니다. –

0

Here are some nice ways. 역행은 아마 가장 적게 관입이다. 그러나 tadman이 지적한대로 exec은 호출 프로세스를 종료합니다.이 프로세스는 자식 프로세스를 만들거나 system을 사용하여 막을 수 있습니다. 다른 답변이 제안한 것처럼

+0

그레이트 링크! 너 고글 ...... –

+0

예, 참으로! : D – Jwosty

+0

['exec'] (http://www.ruby-doc.org/core-2.0/Kernel.html#method-i-exec)는 호출 프로세스를 효과적으로 종료하므로 응답을 얻지 못할 것입니다 , 아마 그 목록에서 마지막 일 것입니다. 왜 가장 읽기 쉬운가? – tadman

1

을 할 수 있지만 그들은 모두 평등하게 창조 아닙니다. 내가 아는 모든 방법을 자세히 설명하려고 노력할 것이다.

역 따옴표

`command arg1 arg2` 
%x(command arg1 arg2) 

는 서브 쉘에서 명령을 실행하고 명령의 출력을 반환합니다. 명령과 인수는 백틱으로 구분 된 문자열로 제공됩니다. 다른 구문은 %x(...)이며 이스케이프 문제를 피하는 역할을합니다 (예 : backticks 자체가 포함 된 명령을 실행하려고 할 때. 괄호는 [], {}, !! 등과 같은 다른 구분 기호로 바꿀 수 있습니다. 이스케이프 문제를 해결할 수 있습니다.

Stderr이 정상적으로 인쇄되면 Stdout이 표시되지 않습니다. 명령의 표준 출력을 리턴합니다. 즉, 백틱 주석을 사용하여 추가 처리를 위해 명령의 출력을 변수로 가져올 수 있습니다. Kernel.exec

exec("command arg1 arg2") 
exec("command", "arg1", "arg2") 

명령을 실행하여 현재 프로세스를 대체합니다. 명령과 인수는 일반 문자열 또는 쉼표로 구분 된 문자열 목록으로 제공됩니다. 이미 인수 목록을 배열로 가지고 있다면 유용 할 수 있습니다. 출력은 그대로 유지됩니다. 즉, 명령이 직접 실행 된 것처럼 콘솔에 인쇄됩니다.

Kernel.system Kernel.exec처럼

system("command arg1 arg2") 
system("command","arg1 arg2") 

하지만 다시 서브 쉘에서 실행됩니다. 프로세스가 올바르게 종료되면 true을 반환하고 그렇지 않으면 false을 반환합니다. 이것은 if -statements 내부에서 잘 작동합니다.

Kernel.spawn

pid = spawn("command") 
# do other stuff 
Process.wait(pid) 
Kernel.system 유사

하지만 지정된 명령을 실행하는 자식 프로세스를 생성합니다. 따라서 상위 프로세스는 Process.wait이 사용되지 않으면 명령 실행이 완료 될 때까지 대기하지 않습니다. 반환 값은 생성 된 프로세스의 PID입니다.

IO.popen

io = IO.popen("command") 
IO.popen("command") {|io| ... } 

하위 프로세스에서 명령을 다시 실행하지만 IO를보다 잘 제어 할 수 있습니다. 자식 프로세스의 stdout 및 stdin은 반환 값 또는 블록 매개 변수로 액세스 할 수있는 IO 객체에 연결됩니다. 반환 값을 통해 얻은 경우 IO 객체는 io.close과 함께 사용한 후 닫아야합니다.