2012-07-23 80 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