Ruby에서 하위 프로세스를 시작하는 각 방법을 사용하는 경우
1. ``
백틱
- 커널에 정의
1. a) %x{}
백분율 X <Backtick에 대한 대체 구문
- parse.y에 정의 됨, 토론 참조
2. system()
삼. fork()
4. open()
- 파이프를 열다
- 커널 #open
4.a. IO.popen()
<는 다음과 동일하게 작동합니다.open()
- 파이프를 열다
- IO # popen
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는이 질문에 대한 완전한 답이 아닙니다.
프로그램의 출력을 변수로 쉽게 캡처하려면 백틱을 사용하십시오. 이것이 차단되기 때문에 단기 실행 프로그램에만 이것을 사용하고 싶을 것입니다.
system
두 가지 경우에 편리합니다.ㅏ. (예를 들어, 당신은 오래 실행되는 프로그램을 가지고 있고 당신은 그것을 실행으로 출력 인쇄 할
system("tar zxvf some_big_tarball.tar.gz")
)비.
system
다음과 같이 셸 확장을 우회 할 수 있습니다exec
(system "echo *"
및 의 출력 비교system "echo", "*"
)시스템은 하위 프로세스가 종료 될 때까지 차단됩니다.
fork
몇 가지 다른 사용 사례도 있습니다.ㅏ. 별도의 프로세스에서 일부 루비 코드를 실행하려고합니다 (예 :
fork { .... }
비. 스크립트 진행을 차단하지 않고 자식 프로세스 (또는 다른 프로그램)를 실행하려고합니다
fork { exec "bash" }
.fork
프로그램을 데몬 화하고 싶다면 친구입니다.IO.popen
프로그램의 표준 출력 및 표준 입력과 상호 작용해야 할 때 유용합니다. 표준 오류를 캡처하지 않으므로2>&1
관심 이 있다면 리디렉션해야 합니다.popen3
표준 오류에 대한 별도의 파일 설명자를 제공합니다 (표준 출력과 별도로 캡처해야하는 경우).PTY.spawn
생성 된 프로그램이 터미널에서 실행하는 것처럼 동작하기를 원할 때 필요합니다. 의 차이보기grep --color=auto pat file
로 양산 할 때system
대를PTY.spawn
이 답변을 기반으로 한 순서도는 다음과 같습니다 . using script
to emulate a terminal을 참조하십시오 .
이 기사 시리즈를 살펴보십시오.
'UFO ET IT' 카테고리의 다른 글
Eclipse에서 Spring MVC 프로젝트를 어떻게 생성합니까? (0) | 2020.12.08 |
---|---|
Linux __user 매크로의 의미는 무엇입니까? (0) | 2020.12.08 |
Unix / Linux 컨텍스트에서 파일이`source`-d이면 어떻게됩니까? (0) | 2020.12.08 |
브라우저에서 방향을 에뮬레이션 할 수 있습니까? (0) | 2020.12.08 |
Java에서 ClassCastException을 던질 수있는 다른 것은 무엇입니까? (0) | 2020.12.08 |