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" !