2012-07-23 13 views
7

Ho bisogno di controllare alcune impostazioni di sistema come ulimit -n dallo script di Scala in Linux. Se avessi a che fare con i comandi normali userei scala.sys.process pacchetto come:Come eseguire shell integrata da Scala

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

Purtroppo questo non funziona per i comandi incorporati della shell. C'è un modo per catturare un output dalla shell integrata in Scala?

Aggiornamento:

Ho provato il solito trucco sh -c "ulimit -n" in diverse forme senza fortuna; Tutti i comandi sotto falliscono:

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

e sto ottenendo un errore di runtime in 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

Hai provato al di fuori del REPL, ad es. In uno script di Scala? –

risposta

10

Quando stringhe vengono convertite in un comando di shell, i parametri sono separati da uno spazio. Le convenzioni che hai provato sono le convenzioni shell, quindi avresti bisogno di una shell per iniziare ad applicarle.

Se si desidera un maggiore controllo su ciascun parametro, utilizzare uno Seq[String] anziché uno String o uno degli impianti Process che equivalgono alla stessa cosa. Per esempio:

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

Ecco fatto! Grazie :) – nab

4

Usa

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

di imitare ciò che il guscio normalmente fa quando si entra sh -c 'ulimit -n'. Cioè, il comando è sh e gli argomenti sono -c e ulimit -n.

Problemi correlati