수색…


소개

운영 체제와 상호 작용하는 데는 여러 가지 방법이 있습니다. Ruby에서 셸 / 시스템 명령이나 하위 프로세스를 실행할 수 있습니다.

비고

임원 :
Exec은 기능이 매우 제한되어 있으며 실행하면 Ruby 프로그램을 종료하고 명령을 실행합니다.

시스템 명령 :
System 명령은 현재 프로세스를 대체하는 대신 하위 셸에서 실행되며 true 또는 nill을 반환합니다. 시스템 명령은 backticks와 마찬가지로 시스템 운영 결과가 완료 될 때까지 기본 응용 프로그램이 대기하는 블로킹 작업입니다. 여기서 주요 작업은 하위 프로세스에서 발생한 예외를 캡처하는 것에 대해 걱정할 필요가 없습니다.

스크립트가 오류없이 실행되었는지 여부에 따라 시스템 기능의 출력은 항상 true 또는 nil이됩니다. 따라서 스크립트를 실행하는 동안 발생하는 모든 오류는 애플리케이션으로 전달되지 않습니다. 주 작업은 하위 프로세스에서 발생한 예외를 캡처하는 것에 대해 걱정할 필요가 없습니다. 이 경우 자식 프로세스가 예외를 발생시키기 때문에 출력은 nil입니다.
이것은 루비 프로그램이 계속하기 전에 명령의 실행이 완료 될 때까지 기다리는 블로킹 작업입니다.
시스템 작업은 fork를 사용하여 현재 프로세스를 포크 한 다음 exec를 사용하여 주어진 작업을 실행합니다.

백틱 (`) :
backtick 문자는 대개 키보드의 이스케이프 키 아래에 있습니다. Backticks는 현재 프로세스를 대체하는 대신 하위 셸에서 실행되고 명령 결과를 반환합니다.
여기에서는 명령 출력을 얻을 수 있지만 예외가 생성되면 프로그램이 중단됩니다.
하위 프로세스에 예외가있는 경우 예외가 주 프로세스에 주어지며 예외가 처리되지 않으면 주 프로세스가 종료 될 수 있습니다. 이것은 루비 프로그램이 계속하기 전에 명령의 실행이 완료 될 때까지 기다리는 블로킹 작업입니다.
시스템 작업은 fork를 사용하여 현재 프로세스를 포크 한 다음 exec를 사용하여 주어진 작업을 실행합니다.

IO.popen :
IO.popen은 하위 프로세스에서 실행됩니다. 여기서 하위 프로세스 표준 입력 및 표준 출력은 IO 객체에 연결됩니다.

Popen3 :
Popen3을 사용하면 표준 입력, 표준 출력 및 표준 오류에 액세스 할 수 있습니다.
하위 프로세스의 표준 입력 및 출력이 IO 객체로 반환됩니다.

$? ($ CHILD_STATUS와 동일)
backticks, system () 또는 % x {} 작업과 함께 사용할 수 있으며 마지막 시스템 실행 명령의 상태를 제공합니다.
이것은 exitstatuspid 등록 정보에 액세스하는 exitstatus 유용 할 수 있습니다.

$?.exitstatus

Ruby에서 쉘 코드를 실행할 때 권장되는 방법은 다음과 같습니다.

Open3.popen3 또는 Open3.capture3 :
Open3은 실제로 Ruby의 스폰 명령을 사용하지만 더 나은 API를 제공합니다.

Open3.popen3

Popen3은 하위 프로세스에서 실행되고 stdin, stdout, stderr 및 wait_thr을 반환합니다.

require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("sleep 5s && ls")
puts "#{stdout.read} #{stderr.read} #{wait_thr.value.exitstatus}"

또는

require 'open3'
cmd = 'git push heroku master'
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
  puts "stdout is:" + stdout.read
  puts "stderr is:" + stderr.read
end

stdout is : stderr is : fatal : 자식 저장소 (또는 부모 디렉토리)가 아닙니다 : .git

또는

require 'open3'
cmd = 'ping www.google.com'
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
  while line = stdout.gets
    puts line
  end
end

출력됩니다 :

32 바이트의 데이터가 포함 된 www.google.com [216.58.223.36]을 핑하십시오.
216.58.223.36에서 응답 : 바이트 = 32 시간 = 16ms TTL = 54
216.58.223.36에서 회신 : 바이트 = 32 시간 = 10ms TTL = 54
216.58.223.36에서 응답 : 바이트 = 32 시간 = 21ms TTL = 54
216.58.223.36에서 응답 : 바이트 = 32 시간 = 29ms TTL = 54
216.58.223.36에 대한 Ping 통계 :
패킷 : 보낸 = 4,받은 = 4, 손실 = 0 (0 % 손실),
대략 왕복 시간 (밀리 초) :
최소 = 10ms, 최대 = 29ms, 평균 = 19ms


Open3.capture3 :

require 'open3'

stdout, stderr, status = Open3.capture3('my_funky_command', 'and', 'some', 'argumants')
if status.success?
  # command completed successfully, do some more stuff
else
  raise "An error occured"
end

또는

Open3.capture3('/some/binary with some args')  

추가적인 오버 헤드와 셸 주입 가능성으로 인해 권장되지 않습니다.

명령이 stdin에서 읽고 일부 데이터를 피드하려는 경우 :

Open3.capture3('my_funky_command', stdin_data: 'read from stdin')  

chdir을 사용하여 다른 작업 디렉토리로 명령을 실행하십시오.

Open3.capture3('my_funky_command', chdir: '/some/directory')  

Ruby에서 셸 코드를 실행하는 독창적 인 방법 :

임원 :

exec 'echo "hello world"'

또는

exec ('echo "hello world"')

시스템 명령 :

system 'echo "hello world"'

명령 창에서 "hello world"를 출력합니다.

또는

system ('echo "hello world"')

시스템 명령은 명령이 성공하면 true를, 그렇지 않으면 nill을 리턴 할 수 있습니다.

result = system 'echo "hello world"'
puts result  # will return a true in the command window

백틱 (`) :

echo "hello world" 명령 창에서 "hello world"를 출력합니다.

결과를 잡을 수도 있습니다.

result = `echo "hello world"`  
puts "We always code a " + result  

IO.popen :

# Will get and return the current date from the system
IO.popen("date") { |f| puts f.gets }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow