Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby에서 시스템 명령을 실행하는 방법

Ruby에서 외부 명령을 실행하려면...

...예:wkhtmltopdf HTML 파일을 PDF로 변환합니다.

사용할 수 있는 몇 가지 Ruby 메서드가 있습니다.

사용하는 방법에 따라 다른 결과를 얻을 수 있습니다 .

이 방법들을 함께 살펴봅시다!

루비 시스템 방법

Ruby 시스템 방식은 외부 명령을 실행하는 가장 간단한 방법입니다.

이렇게 생겼어요 :

system("ls")

system 발생하는 대로 명령 출력을 인쇄합니다.

또한 시스템은 Ruby 프로그램이 명령이 완료될 때까지 기다리게 합니다. .

이것을 시도하십시오:

system("sleep 2")

나중에 살펴보겠지만 백그라운드에서 명령을 실행하는 방법이 있습니다.

시스템은 3개의 가능한 값을 반환할 수 있습니다. :

  • true 명령이 작동한 경우
  • false 명령이 오류 코드를 반환하는 경우
  • nil 명령 실행이 실패한 경우(명령을 찾을 수 없음)

종료 상태 코드를 받을 수 있습니다. $?로 실행한 마지막 외부 명령의 전역 변수. 이 상태 코드는 명령이 실패한 이유에 대한 자세한 정보를 제공할 수 있습니다.

쉘 확장이란 무엇입니까?

system으로 외부 명령을 실행할 때 "쉘 확장" 효과를 얻을 수 있습니다.

셸 확장은 셸(sh/bash/zsh)이 일부 특수 문자(* , ? , 및 [ ) 명령에서 &파일 목록으로 확장 .

예:

system("echo *")

현재 디렉토리의 모든 파일과 폴더를 인쇄합니다.

* 명령이 실행되기 전에 파일 목록으로 바뀝니다.

이러한 특수 문자를 그대로 사용하려면 인수를 두 번째 인수로 전달하세요. system의 .

다음과 같이:

system("echo", "*")

이제 출력은 *가 됩니다. .

환경 변수 사용 방법

특정 환경 변수를 외부 명령에 전달하려는 경우 해시를 첫 번째 인수로 사용할 수 있습니다 .

다음은 예입니다:

system({"rubyguides" => "best"}, "ruby", "-e p ENV['rubyguides']")

# "best"

이것은 Ruby 애플리케이션의 현재 환경을 변경하지 않습니다.

%x / 커널#`

실행 중인 명령에서 출력을 얻으려면 표시하는 대신 %x를 사용할 수 있습니다. 또는 Kernel#` 방법.

그들은 똑같은 일을 합니다.

예시 :

`ls`

%x가 있는 또 다른 :

%x|ls|

이 두 예는 출력이 있는 문자열을 반환합니다. ls의 명령.

스레드 내에서 실행하지 않는 한 명령이 완료될 때까지 기다려야 합니다.

Fork + Exec을 사용하여 별도의 프로세스에서 외부 명령을 실행하는 방법

Forking은 현재 프로세스(Ruby 앱)의 복사본을 만든 다음 exec를 사용하여 해당 복사본을 다른 프로세스로 교체할 수 있습니다. .

<블록 인용>

참고 :Windows에서는 fork 방식을 사용할 수 없습니다.

이것은 Unix 세계에서 인기 있는 패턴입니다.

작동 방식은 다음과 같습니다. :

fork { exec("ls") }

ls가 실행됩니다. 다른 프로세스에서 출력을 표시합니다.

이 명령이 다른 프로세스에서 실행 중이기 때문에 Ruby 앱이 system처럼 실행되는 것을 차단하지 않습니다. 메소드 또는 %x .

중요:

exec를 사용하는 경우 fork 없이 현재 프로세스를 대체하게 됩니다.

즉, Ruby 프로그램이 종료됩니다.

외부 프로그램과 양방향 통신을 위해 공개 방식을 사용하는 방법

필요한 경우:

  • 프로세스 제어 강화
  • 양방향 커뮤니케이션

그런 다음 IO.popen 방법이 당신이 찾고 있는 것입니다.

다음 예에서는 popen 메소드를 사용하여 irb 처리한 다음 일부 입력을 보내고 출력을 읽습니다.

예시 :

r = IO.popen("irb", "r+")

r.write "puts 123 + 1\n"

3.times { puts r.gets }

r.write "exit\n"

r 변수는 IO 개체입니다. 즉, 일반 파일처럼 쓰고 읽을 수 있습니다. .

popen 사용 또한 외부 명령이 자체 프로세스에서 실행되므로 스레드에서 실행할 필요가 없습니다.

popen3도 있습니다. 표준 라이브러리의 메서드입니다.

일반 popen과의 차이점 일반 출력 및 오류 메시지를 별도의 IO 개체로 분할한다는 것입니다.

결론

Ruby에서 외부 명령과 상호 작용할 수 있는 다양한 방법에 대해 배웠습니다.

이것들을 조심하세요!

보안을 원하지 않는 한 이러한 명령에 어떤 종류의 사용자 입력도 전달하지 마세요. Ruby 앱의 문제

새로운 사실을 알게 된 경우 이 기사를 공유하여 더 많은 사람들이 볼 수 있도록 하십시오.

읽어주셔서 감사합니다 🙂