我需要检查一些系统设置,例如ulimit -n
Linux中的Scala脚本.如果我处理普通的命令,我会使用scala.sys.process
像:
import scala.sys.process._
println("ls -lha".!!)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这对shell内置函数不起作用.有没有办法从Scala中内置的shell中捕获输出?
更新:
我尝试了sh -c "ulimit -n"
几种形式的通常技巧而没有运气; 以下所有命令均失败:
"sh -c 'ulimit -n'".!!
"sh -c \"ulimit -n\"".!!
"""sh -c "ulimit -n"""".!!
"""sh -c "ulimit -n """ + "\"".!!
Run Code Online (Sandbox Code Playgroud)
我在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)
Run Code Online (Sandbox Code Playgroud)
Dan*_*ral 11
将字符串转换为shell命令时,参数按空格分隔.您尝试的约定是shell约定,因此您需要一个shell来开始应用它们.
如果您想要更多地控制每个参数是什么,请使用a Seq[String]
而不是a String
或其中一个相同的Process
工厂.例如:
Seq("sh", "-c", "ulimit -n").!!
Run Code Online (Sandbox Code Playgroud)
使用
println( Process("sh", Seq("-c","ulimit -n")).!! )
Run Code Online (Sandbox Code Playgroud)
进入时模仿shell通常会做什么sh -c 'ulimit -n'
.也就是说,命令是sh
和参数是-c
和ulimit -n
.
归档时间: |
|
查看次数: |
5099 次 |
最近记录: |