UFO ET IT

Ruby에서 하위 프로세스를 시작하는 각 방법을 사용하는 경우

ufoet 2020. 12. 8. 20:29
반응형

Ruby에서 하위 프로세스를 시작하는 각 방법을 사용하는 경우


1. ``백틱

1. a) %x{}백분율 X <Backtick에 대한 대체 구문

  • parse.y에 정의 됨, 토론 참조

2. system()

삼. fork()

4. open()

4.a. IO.popen()<는 다음과 동일하게 작동합니다.open()

4.b. open("|-")

  • 파이프에 포크

4.c. IO.popen("-")<는 다음과 동일하게 작동합니다.open("|-")

  • 파이프에 포크
  • 토론 참조

5. Open3.popen3()

  • require 'open3'
  • stdlib Open3

6. PTY.spawn()

  • require 'pty'
  • stdlib PTY

7. Shell.transact()

  • require 'shell'
  • stdlib

더 복잡한 방법 중 하나에 대해 신뢰할 수있는 백틱을 언제 포기해야합니까?

편집 1. Avdi Grimm 이 각 방법의 사용 예를 설명하는 게시물에 감사드립니다 . # 1 (& gist ); # 2 (& 요점 ); # 3 .

그것들은 How 에 답할 수있는 환상적인 자원 이지만, 각각이 언제 사용되어야하는지 또는 Why 에 대한 답을 명시 적으로 구성되어 있지 않으며 , 따라서 IMHO는이 질문에 대한 완전한 답이 아닙니다.


  1. 프로그램의 출력을 변수로 쉽게 캡처하려면 백틱을 사용하십시오. 이것이 차단되기 때문에 단기 실행 프로그램에만 이것을 사용하고 싶을 것입니다.

  2. system 두 가지 경우에 편리합니다.

    ㅏ. (예를 들어, 당신은 오래 실행되는 프로그램을 가지고 있고 당신은 그것을 실행으로 출력 인쇄 할 system("tar zxvf some_big_tarball.tar.gz"))

    비. system다음과 같이 셸 확장을 우회 할 수 있습니다 exec( system "echo *"의 출력 비교 system "echo", "*")

    시스템은 하위 프로세스가 종료 될 때까지 차단됩니다.

  3. fork 몇 가지 다른 사용 사례도 있습니다.

    ㅏ. 별도의 프로세스에서 일부 루비 코드를 실행하려고합니다 (예 :fork { .... }

    비. 스크립트 진행을 차단하지 않고 자식 프로세스 (또는 다른 프로그램)를 실행하려고합니다 fork { exec "bash" }.

    fork 프로그램을 데몬 화하고 싶다면 친구입니다.

  4. IO.popen프로그램의 표준 출력 및 표준 입력과 상호 작용해야 할 때 유용합니다. 표준 오류를 캡처하지 않으므로 2>&1관심 있다면 리디렉션해야 합니다.

  5. popen3 표준 오류에 대한 별도의 파일 설명자를 제공합니다 (표준 출력과 별도로 캡처해야하는 경우).

  6. PTY.spawn생성 된 프로그램이 터미널에서 실행하는 것처럼 동작하기를 원할 때 필요합니다. 의 차이보기 grep --color=auto pat file로 양산 할 때 system대를PTY.spawn


이 답변을 기반으로 한 순서도는 다음과 같습니다 . using scriptto emulate a terminal을 참조하십시오 .

여기에 이미지 설명 입력


이 기사 시리즈를 살펴보십시오.

참고 URL : https://stackoverflow.com/questions/7212573/when-to-use-each-method-of-launching-a-subprocess-in-ruby

반응형