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 앱의 문제
새로운 사실을 알게 된 경우 이 기사를 공유하여 더 많은 사람들이 볼 수 있도록 하십시오.
읽어주셔서 감사합니다 🙂