前提
- 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