1. 外部プロセス

外部プロセス 

使い方 

Scalaには、外部プロセスを簡単に扱うためのプロセスライブラリが含まれています。import scala.sys.process._を使用して、暗黙の変換をスコープに取り込みます。

外部コマンドを実行するには、感嘆符!を付けます。

"find project -name *.jar" !

暗黙的にStringscala.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で他の場所で定義されたフィルター用の演算子と区別するために、#で始まります。以下の演算子定義では、abはサブコマンドです。

  • a #&& b aを実行します。終了コードがゼロ以外の場合は、その終了コードを返し、bを実行しません。終了コードがゼロの場合は、bを実行し、その終了コードを返します。
  • a #|| b aを実行します。終了コードがゼロの場合は、終了コードとしてゼロを返し、bを実行しません。終了コードがゼロ以外の場合は、bを実行し、その終了コードを返します。
  • a #| b abを実行し、aの出力をbの入力にパイプします。

Fileへの出力のリダイレクト、およびFileURLからの入力のための演算子も定義されています。以下の定義では、urlURLのインスタンスであり、fileFileのインスタンスです。

  • a #< urlまたはurl #> a urlaへの入力として使用します。aは、Fileまたはコマンドにすることができます。
  • a #< fileまたはfile #> a fileaへの入力として使用します。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_!

最後に、FileURLの内容を標準出力に送信するためのcatメソッドがあります。

 

URLFileにダウンロードする

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