1. 外部程序

外部程序 

用法 

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,先傳遞命令序列(命令和引數清單)或命令字串,然後再傳遞工作目錄。任何環境變數都可以做為鍵/值字串對的 vararg 清單傳遞。

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 #< urlurl #> a 使用 url 做為 a 的輸入。a 可以是 File 或命令。
  • a #< filefile #> a 使用 file 做為 a 的輸入。a 可以是 File 或命令。
  • a #> filefile #< aa 的輸出寫入 file。a 可以是 File、URL 或命令。
  • a #>> filefile #<< aa 的輸出附加到 file。a 可以是 File、URL 或命令。

還有一些額外的方法可以將分叉程序的輸出取得為 String 或將輸出列做為 Stream[String]。以下是一些範例,但請參閱 ProcessBuilder API 以取得詳細資訊。

val listed: String = "ls" !!
val lines2: Stream[String] = "ls" lines_!

最後,有一個 cat 方法可將 FileURL 的內容傳送到標準輸出。

範例 

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