다음 Ruby 메소드의 차이점은 무엇입니까?
exec
, system
및 %x()
또는 역 따옴표
Ruby를 통해 프로그래밍 방식으로 터미널 명령을 실행하는 데 사용되지만 3 가지 방법이있는 이유를 알고 싶습니다.
다음 Ruby 메소드의 차이점은 무엇입니까?
exec
, system
및 %x()
또는 역 따옴표
Ruby를 통해 프로그래밍 방식으로 터미널 명령을 실행하는 데 사용되지만 3 가지 방법이있는 이유를 알고 싶습니다.
답변:
체계
이 system
메소드는 시스템 프로그램을 호출합니다. 이 메소드에 명령을 문자열 인수로 제공해야합니다. 예를 들면 다음과 같습니다.
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
호출 된 프로그램은 전류를 사용 STDIN
, STDOUT
그리고 STDERR
루비 프로그램의 객체. 사실, 실제 반환 값 중 하나입니다 true
, false
또는 nil
. 이 예에서 날짜는의 IO 객체를 통해 인쇄되었습니다 STDIN
. true
프로세스가 0 상태로 종료 된 경우, 프로세스가 0이 아닌 상태로 false
종료 된 nil
경우 및 실행이 실패한 경우 메소드가 리턴 합니다 .
또 다른 부작용은 전역 변수 $?
가 Process::Status
객체 로 설정되어 있다는 것입니다. 이 오브젝트에는 호출 된 프로세스의 프로세스 ID (PID) 및 종료 상태를 포함하여 호출 자체에 대한 정보가 포함됩니다.
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
백틱
백틱 (``)은 시스템 프로그램을 호출하고 출력을 반환합니다. 첫 번째 접근 방식과 달리 명령은 문자열을 통해 제공되는 것이 아니라 백틱 쌍 안에 넣는 방식으로 제공됩니다.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
전역 변수 $?
도 백틱을 통해 설정됩니다. 백틱을 사용하면 문자열 보간을 사용할 수도 있습니다.
%엑스()
사용 %x
은 백틱 스타일의 대안입니다. 출력도 반환합니다. 친척 %w
이나 %q
다른 사람 과 마찬가지로 모든 구분 기호는 대괄호 스타일 구분 기호가 일치하는 한 충분합니다. 이 수단 %x(date)
, %x{date}
및 %x-date-
모든 동의어입니다. 백틱처럼 %x
문자열 보간을 사용할 수 있습니다.
exec
Kernel#exec
현재 프로세스 (Ruby 스크립트) 를 사용 하여를 통해 호출 된 프로세스로 바뀝니다 exec
. 이 메소드는 문자열을 인수로 사용할 수 있습니다. 이 경우 문자열에 쉘 확장이 적용됩니다. 둘 이상의 인수를 사용하는 경우 첫 번째 인수는 프로그램을 실행하는 데 사용되며 다음은 호출 할 프로그램에 대한 인수로 제공됩니다.
Open3.popen3
때로는 필요한 정보가 표준 입력 또는 표준 오류에 기록되므로 해당 정보를 제어해야합니다. 여기 Open3.popen3
에 편리합니다 :
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end
STDIN
, STDOUT
, STDERR
, 고려 Open3.popen3
대신; 예 : stackoverflow.com/a/10922097/258662