0
0

More than 1 year has passed since last update.

Rubyで外部コマンドを実行する方法メモ

Posted at

前提

  • Ruby 3.1.2

Kernel.#`

  • 基本的にはこれを使うことが多い
  • コマンドの標準出力を文字列として返す
  • 終了ステータスは$?で確認する
def exec_command(command)
  result = `#{command}`

  raise RuntimeError, "`#{command}` is failed." unless $?.success?

  result
end

p exec_command('ruby -v')
=>
"ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]\n"

Kernel.#system

  • あまり使うことなさそう
  • 子プロセスでコマンド実行する
    • 生成した子プロセスの終了を待つ
  • 終了ステータス0でtrue、それ以外はfalseを返す
    • そもそも実行できなかった場合はnil
  • 終了ステータスは$?で確認する
def exec_command(command)
  result = system(command)

  raise RuntimeError, "`#{command}` is failed." unless $?.success?

  result
end

p exec_command('sleep 10; echo "finish sleep"')
p exec_command('ruby -v')
=>
finish sleep
true
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]
true

Kernel.#exec

  • あまり使うことなさそう
  • 該当プロセスの実行内容がコマンド実行に変わる
    • 実行後、本来の処理には戻らない
def exec_command(command)
  exec(command)
end

p exec_command('ruby -v')
p 'not exec'
=>
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]

Kernel.#spawn

  • 並列実行したい場合に使う
  • 子プロセスでコマンド実行する
    • 生成した子プロセスの終了を待たない
  • 子プロセスのプロセスIDを返す
def exec_command(command)
  spawn(command)
end

p exec_command('sleep 10; echo "finish sleep"')
p exec_command('ruby -v')
=>
96755
96756
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-darwin19]
finish sleep
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0