source

Ruby, exec, 시스템 및 %x() 또는 Backticks 간의 차이

ittop 2023. 6. 26. 23:08
반응형

Ruby, exec, 시스템 및 %x() 또는 Backticks 간의 차이

다음 루비 방법의 차이점은 무엇입니까?

exec,system그리고.%x()또는 백틱스

Ruby를 통해 터미널 명령을 프로그래밍 방식으로 실행하는 데 사용되는 것은 알지만, 이를 수행하는 데 세 가지 다른 방법이 있는 이유를 알고 싶습니다.

시스템.

메소드가 시스템 프로그램을 호출합니다.이 메서드에 대한 문자열 인수로 명령을 제공해야 합니다.예:

>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true

호출된 프로그램이 현재를 사용합니다.STDIN,STDOUT그리고.STDERRRuby 프로그램의 개체입니다.사실, 실제 수익률은 다음 중 하나입니다.true,false또는nil예제에서 날짜는 다음의 IO 개체를 통해 인쇄되었습니다.STDIN메소드가 반환됩니다.true프로세스가 0 상태로 종료된 경우false프로세스가 0이 아닌 상태로 종료된 경우nil실행이 실패한 경우

루비 2.6 기준, 합격exception: true복귀하는 대신 예외를 제기할 것입니다.false또는nil:

>> system('invalid')
=> nil

>> system('invalid', exception: true)
Traceback (most recent call last):
...
Errno::ENOENT (No such file or directory - invalid)

또 다른 부작용은 전역 변수가$?개체로 설정됩니다.이 개체는 호출된 프로세스의 프로세스 식별자(PID) 및 종료 상태를 포함하여 호출 자체에 대한 정보를 포함합니다.

>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>

백스틱스

Backticks('')는 시스템 프로그램을 호출하고 출력을 반환합니다.첫 번째 접근 방식과 달리 명령어는 문자열을 통해 제공되지 않고 백스틱 쌍 안에 배치하여 제공됩니다.

>> `date`
=> Wed Sep 4 22:22:51 CEST 2013   

전역 변수$?백트릭으로도 설정되어 있습니다.백스틱을 사용하여 문자열 보간을 사용할 수도 있습니다.

%x1500

사용.%x백스틱 스타일의 대안입니다.출력도 반환됩니다.그것의 친척들처럼.%w그리고.%q괄호 스타일 구분 기호가 일치하는 경우에는 구분 기호가 있으면 됩니다.이것은 의미합니다.%x(date),%x{date}그리고.%x-date-모두 동의어입니다.백트릭처럼%x문자열 보간을 사용할 수 있습니다.

집행인

현재 프로세스(Ruby 스크립트)를 사용하면 다음을 통해 호출되는 프로세스로 대체됩니다.exec메서드는 문자열을 인수로 사용할 수 있습니다.이 경우 문자열은 셸 확장의 영향을 받습니다.둘 이상의 인수를 사용할 경우 첫 번째 인수가 프로그램을 실행하는 데 사용되며 다음은 호출될 프로그램에 대한 인수로 제공됩니다.

오픈3.popen3

때로는 필요한 정보가 표준 입력 또는 표준 오류에 기록되며 이러한 정보도 제어해야 합니다.다음은 유용한 기능입니다.

require 'open3'

Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
   pid = thread.pid
   puts stdout.read.chomp
end

여기 이 답변을 바탕으로 한 흐름도가 있습니다.참고 항목, 터미널 에뮬레이트에 사용.

enter image description here

그들은 다른 일을 합니다. exec현재 프로세스를 새 프로세스로 대체하고 다시는 돌아오지 않습니다. system다른 프로세스를 호출하고 종료 값을 현재 프로세스로 반환합니다.백택스를 사용하면 다른 프로세스가 호출되고 해당 프로세스의 출력이 현재 프로세스로 반환됩니다.

제 경우엔 성공했습니다.

output = `nmap localhost`

이것은 당신의 출력을 변수에 저장하기 때문에 답은 시스템 대신 ''를 사용하는 것입니다.

언급URL : https://stackoverflow.com/questions/6338908/ruby-difference-between-exec-system-and-x-or-backticks

반응형