2012-07-23 51 views
7

Necesito verificar algunas configuraciones del sistema como ulimit -n del script Scala en Linux. Si hubiera que tratar con los comandos ordinarios Me gustaría utilizar scala.sys.process paquete como:Cómo ejecutar shell builtin desde Scala

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

Desafortunadamente esto no funciona para órdenes internas. ¿Hay alguna forma de capturar una salida desde el shell incorporado en Scala?

Actualización:

He probado el truco habitual sh -c "ulimit -n" en varias formas sin suerte; Todos los comandos de abajo fallan:

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

y me estoy poniendo un error de ejecución en 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

¿Lo intentó fuera del REPL, por ejemplo, en un script de Scala? –

Respuesta

10

Cuando se convierten las cadenas de un comando shell, los parámetros están separados por el espacio. Las convenciones que probó son shell convenciones, por lo que necesitaría un intérprete de comandos para comenzar a aplicarlas.

Si desea tener más control sobre lo que es cada parámetro, use un Seq[String] en lugar de un String, o una de las fábricas Process que equivalen a lo mismo. Por ejemplo:

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

¡Eso es todo! Gracias :) – nab

4

Uso

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

de imitar lo que la cáscara hace normalmente cuando se introduce sh -c 'ulimit -n'. Es decir, el comando es sh y los argumentos son -c y ulimit -n.

Cuestiones relacionadas