8

我需要检查一些系统设置,例如ulimit -nLinux 中的 Scala 脚本。如果我要处理普通命令,我会使用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)
4

2 回答 2

11

当字符串转换为 shell 命令时,参数用空格分隔。您尝试的约定是外壳约定,因此您需要一个外壳才能开始应用它们。

如果您想更好地控制每个参数是什么,请使用 aSeq[String]而不是 a String,或者使用Process相当于同一事物的工厂之一。例如:

Seq("sh", "-c", "ulimit -n").!!
于 2012-07-23T19:01:29.120 回答
5

采用

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

模仿 shell 通常在你输入时所做的事情sh -c 'ulimit -n'。也就是说,命令是sh,参数是-culimit -n

于 2012-07-23T19:01:34.757 回答