2012-07-23 24 views
7

我需要在Linux中檢查Scala腳本中的一些系統設置,如ulimit -n。如果我對付普通的命令,我會用scala.sys.process包裝,如:如何從Scala執行shell內建

import scala.sys.process._ 
println("ls -lha".!!) 

不幸的是,這並不爲shell內建的工作。有什麼方法可以在Scala中捕獲shell內建的輸出嗎?

更新:

我試圖慣用的伎倆sh -c "ulimit -n"幾種形式,沒有運氣;下面所有命令失敗:

"sh -c 'ulimit -n'".!! 
"sh -c \"ulimit -n\"".!! 
"""sh -c "ulimit -n"""".!! 
"""sh -c "ulimit -n """ + "\"".!! 

而且我在REPL得到一個運行時錯誤:

-n": 1: Syntax error: Unterminated quoted string 
java.lang.RuntimeException: Nonzero exit value: 2 
    at scala.sys.package$.error(package.scala:27) 
    at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.slurp(ProcessBuilderImpl.scala:131) 
    at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.$bang$bang(ProcessBuilderImpl.scala:101) 
    at .<init>(<console>:11) 
    at .<clinit>(<console>) 
    at .<init>(<console>:11) 
    at .<clinit>(<console>) 
    at $print(<console>) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) 
    at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920) 
    at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43) 
    at scala.tools.nsc.io.package$$anon$2.run(package.scala:25) 
    at java.lang.Thread.run(Thread.java:722) 
+0

您是否在REPL之外嘗試過它,例如在Scala腳本中? – 2012-07-23 18:52:37

回答

10

當字符串轉換爲一個shell命令,參數之間用空格分隔。您嘗試的約定是shell約定,所以您需要一個shell來開始應用它們。

如果您想更多地控制每個參數,請使用Seq[String]而不是StringProcess工廠之一。例如:

Seq("sh", "-c", "ulimit -n").!! 
+0

就是這樣!謝謝 :) – nab 2012-07-23 19:03:48

4

使用

println(Process("sh", Seq("-c","ulimit -n")).!!) 

模仿,當你進入sh -c 'ulimit -n'什麼殼一般不會。也就是說,命令是sh,參數是-culimit -n