Scalaには、外部プロセスを簡単に扱うためのプロセスライブラリが含まれています。import scala.sys.process._を使用して、暗黙の変換をスコープに取り込みます。
外部コマンドを実行するには、感嘆符!を付けます。
"find project -name *.jar" !
暗黙的にStringをscala.sys.process.ProcessBuilderに変換し、!メソッドを定義します。このメソッドは、構築されたコマンドを実行し、コマンドが完了するまで待機し、終了コードを返します。あるいは、ProcessBuilderで定義されたrunメソッドは、コマンドを実行し、scala.sys.process.Processのインスタンスを返します。これは、コマンドが完了する前にプロセスをdestroyするために使用できます。引数がない場合、!メソッドは出力を標準出力と標準エラーに送信します。!メソッドにLoggerを渡して、出力をLoggerに送信できます。
"find project -name *.jar" ! log
Loggerは次のようにして取得できます。
val log = streams.value.log
ワーキングディレクトリを設定したり、環境を修正したりする必要がある場合は、コマンドシーケンス(コマンドと引数リスト)またはコマンド文字列を最初に、次にワーキングディレクトリを渡して、scala.sys.process.Processを明示的に呼び出します。環境変数は、キー/値のStringペアの可変引数リストとして渡すことができます。
Process("ls" :: "-l" :: Nil, Path.userHome, "key1" -> value1, "key2" -> value2) ! log
演算子は、コマンドを組み合わせるために定義されています。これらの演算子は、優先順位を同じに保ち、sbtで他の場所で定義されたフィルター用の演算子と区別するために、#で始まります。以下の演算子定義では、aとbはサブコマンドです。
a #&& b aを実行します。終了コードがゼロ以外の場合は、その終了コードを返し、bを実行しません。終了コードがゼロの場合は、bを実行し、その終了コードを返します。a #|| b aを実行します。終了コードがゼロの場合は、終了コードとしてゼロを返し、bを実行しません。終了コードがゼロ以外の場合は、bを実行し、その終了コードを返します。a #| b aとbを実行し、aの出力をbの入力にパイプします。Fileへの出力のリダイレクト、およびFileとURLからの入力のための演算子も定義されています。以下の定義では、urlはURLのインスタンスであり、fileはFileのインスタンスです。
a #< urlまたはurl #> a urlをaへの入力として使用します。aは、Fileまたはコマンドにすることができます。a #< fileまたはfile #> a fileをaへの入力として使用します。aは、Fileまたはコマンドにすることができます。a #> fileまたはfile #< a aの出力をfileに書き込みます。aは、File、URL、またはコマンドにすることができます。a #>> fileまたはfile #<< a aの出力をfileに追記します。aは、File、URL、またはコマンドにすることができます。フォークされたプロセスからの出力をStringまたは出力行をStream[String]として取得するための追加メソッドがいくつかあります。いくつかの例を以下に示しますが、詳細についてはProcessBuilder APIを参照してください。
val listed: String = "ls" !!
val lines2: Stream[String] = "ls" lines_!
最後に、FileとURLの内容を標準出力に送信するためのcatメソッドがあります。
URLをFileにダウンロードする
url("http://databinder.net/dispatch/About") #> file("About.html") !
// or
file("About.html") #< url("http://databinder.net/dispatch/About") !
Fileをコピーする
file("About.html") #> file("About_copy.html") !
// or
file("About_copy.html") #< file("About.html") !
grepでフィルタリングした後、URLの内容をFileに追記する
url("http://databinder.net/dispatch/About") #> "grep JSON" #>> file("About_JSON") !
// or
file("About_JSON") #<< ( "grep JSON" #< url("http://databinder.net/dispatch/About") ) !
ソースディレクトリでnullの使用を検索する
"find src -name *.scala -exec grep null {} ;" #| "xargs test -z" #&& "echo null-free" #|| "echo null detected" !
catを使用する
val spde = url("http://technically.us/spde/About")
val dispatch = url("http://databinder.net/dispatch/About")
val build = file("project/build.properties")
cat(spde, dispatch, build) #| "grep -i scala" !