프랭크를 사용하여 iOS 테스트를하고 있습니다. 오이를 사용하는 루비 보석입니다. 앱 실행 여부 또는 충돌 여부를 확인하는 "감안할"단계가 있습니다. 내 단계에서 응용 프로그램을 다시 시작하고 싶습니다. 내가 오이 .feature 파일 근처에 저장되어있는 쉘 스크립트를 사용하여 응용 프로그램을 시작합니다.루비에서 쉘 스크립트를 실행하십시오.
해당 단계 정의에서 스크립트를 어떻게 호출 할 수 있습니까?
프랭크를 사용하여 iOS 테스트를하고 있습니다. 오이를 사용하는 루비 보석입니다. 앱 실행 여부 또는 충돌 여부를 확인하는 "감안할"단계가 있습니다. 내 단계에서 응용 프로그램을 다시 시작하고 싶습니다. 내가 오이 .feature 파일 근처에 저장되어있는 쉘 스크립트를 사용하여 응용 프로그램을 시작합니다.루비에서 쉘 스크립트를 실행하십시오.
해당 단계 정의에서 스크립트를 어떻게 호출 할 수 있습니까?
당신은 루비에서 쉘 스크립트를 실행하는 여러 가지 방법이 있습니다,이 몇 가지 방법
Kernel.system "command"
%x[command]
`command`
Here are some nice ways. 역행은 아마 가장 적게 관입이다. 그러나 tadman이 지적한대로 exec
은 호출 프로세스를 종료합니다.이 프로세스는 자식 프로세스를 만들거나 system
을 사용하여 막을 수 있습니다. 다른 답변이 제안한 것처럼
을 할 수 있지만 그들은 모두 평등하게 창조 아닙니다. 내가 아는 모든 방법을 자세히 설명하려고 노력할 것이다.
`command arg1 arg2`
%x(command arg1 arg2)
는 서브 쉘에서 명령을 실행하고 명령의 출력을 반환합니다. 명령과 인수는 백틱으로 구분 된 문자열로 제공됩니다. 다른 구문은 %x(...)
이며 이스케이프 문제를 피하는 역할을합니다 (예 : backticks 자체가 포함 된 명령을 실행하려고 할 때. 괄호는 []
, {}
, !!
등과 같은 다른 구분 기호로 바꿀 수 있습니다. 이스케이프 문제를 해결할 수 있습니다.
Stderr이 정상적으로 인쇄되면 Stdout이 표시되지 않습니다. 명령의 표준 출력을 리턴합니다. 즉, 백틱 주석을 사용하여 추가 처리를 위해 명령의 출력을 변수로 가져올 수 있습니다. Kernel.exec
exec("command arg1 arg2")
exec("command", "arg1", "arg2")
Kernel.exec
처럼system("command arg1 arg2")
system("command","arg1 arg2")
하지만 다시 서브 쉘에서 실행됩니다. 프로세스가 올바르게 종료되면 true
을 반환하고 그렇지 않으면 false
을 반환합니다. 이것은 if
-statements 내부에서 잘 작동합니다.
pid = spawn("command")
# do other stuff
Process.wait(pid)
Kernel.system
유사
하지만 지정된 명령을 실행하는 자식 프로세스를 생성합니다. 따라서 상위 프로세스는 Process.wait
이 사용되지 않으면 명령 실행이 완료 될 때까지 대기하지 않습니다. 반환 값은 생성 된 프로세스의 PID입니다.
io = IO.popen("command")
IO.popen("command") {|io| ... }
하위 프로세스에서 명령을 다시 실행하지만 IO를보다 잘 제어 할 수 있습니다. 자식 프로세스의 stdout 및 stdin은 반환 값 또는 블록 매개 변수로 액세스 할 수있는 IO 객체에 연결됩니다. 반환 값을 통해 얻은 경우 IO 객체는 io.close
과 함께 사용한 후 닫아야합니다.
그건 그렇고,'Kernel '은 필요 없다. 해당 모듈은 기본적으로 Object에 이미 포함되어 있습니다. 아니면 그런 식으로. – Jwosty
네, 같은 이름의 로컬 메소드가 없다면,'Kernel' 접두사는 중복되지만, 문서를 찾는 것과 관련이 있습니다. 사방에 나타나는 마법의 방법은 대개 Kernel에 있습니다. – tadman
@tadman이 말한 정확한 이유 때문에 항상 네임 스페이스를 사용하는 것이 좋습니다. –