Edited at

scala.sys.processでリターンコードだけ受け取る

More than 3 years have passed since last update.

 外部のプロセスを呼び出すとき、「標準出力・エラーには何も出さず、ただリターンコードだけ取りたい」という場合があります。しかし、scalaでこれを実現するスマートな方法がよく分かりません。#>は標準出力しか変えられないようですし (仮に変えられるとしても、どこに変えればいいんでしょう… /dev/null?)、ちょっと困りました。

 そこでとりあえず、出力先のロガーをでっち上げる力技で解決しています。

import scala.sys.process.{ProcessLogger, Process}

def exitCode(target: String) =
Process(target) ! new ProcessLogger {
def out(s: => String) {}
def err(s: => String) {}
def buffer[T](f: => T): T = f
}

「詳しい話はよく分からないが、これでとりあえず動く」という理想的状態ですね!

 もっとマシな方法が見つかったならば追記します。


追記

 コメント欄で教えて頂きましたが、標準エラーを捨てるためにロガーを渡すアイデアはドキュメントにもあります。だとすると、方向性としてはこれが最適なのかもしれません。

 ただし具体的な方法としてはapplyを使うべきです。

def exitCode(target: String) = Process(target) ! ProcessLogger(str => ())

 このくらい短く書けるなら、面倒はなさそうです。

※ scalaのドキュメント、上部のタイトルをクリックすることでオブジェクト ⇔ トレイトの情報が交互に表示されるんですね… いま初めて気が付きました