我需要从
Linux中的Scala脚本检查一些系统设置,如ulimit -n.如果我要处理普通命令,我会使用scala.sys.process包,如:
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)
解决方法
将字符串转换为shell命令时,参数由空格分隔.您尝试的约定是shell约定,因此您需要一个shell来开始应用它们.
如果您想要更多地控制每个参数是什么,请使用Seq [String]而不是String,或者使用一个相同的Process工厂.例如:
Seq("sh","-c","ulimit -n").!!