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