読者です 読者をやめる 読者になる 読者になる

カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

RubyでOSの外部コマンドを実行したいときに、spawnを使うと便利だった件

またもや、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いいよって話でした。