またもや、Rubyネタ。ちょくちょく更新して参ります。
外部コマンドを実行するやり方については、このサイトにまとまっています。 んで、なんかいいライブラリないかと。
が、今回僕が欲しかった機能として、
- コマンドが叩ける(当然
- 標準出力・標準エラー出力サポート(叩いて終わりはダメ。そのコマンドのエラーメッセージが見たい
- 例外処理がしやすい
であります。
systemだと、例外処理は終了ステータスで処理できるけど、どんなエラーを吐いてるか分からないから、このコマンドがエラーを吐いてますとしか言えない。
Open3.capture3だと、エラーは出力することができる。だけど、コマンド失敗した時点でOpen3自体がエラー処理して、そこで止まってしまい、例外処理しにくい。コマンドこけても、継続させることが不可能とか。
systemuは組み込みじゃないので、可能であれば避けたい。最後の手段にしたい。
ってなったときに調べてたら、spawnってものが。
無事最初に示した条件を満たしております。ってことで、以下のような感じにした。
def cmd(command) begin spawn(command, STDERR=>STDOUT) rescue Errno::ENOENT => e puts "[failed command] #{command}" puts "[message] #{e.message}" @success = false end end attr_accessor :success
これでコマンド失敗したら、エラーも出力できるし、例外処理して、継続させるなり、自由にできる。
ってことで、spawnいいよって話でした。