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
中其他地方定義的篩選器運算子分開。在下列運算子定義中,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_!
最後,有一個 cat
方法可將 File
和 URL
的內容傳送到標準輸出。
將 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" !