2012-07-23 17 views
7

Muszę sprawdzić niektóre ustawienia systemowe, takie jak ulimit -n ze skryptu Scala w systemie Linux. Gdybym do czynienia ze zwykłych komend użyłbym scala.sys.process pakiet jak:Jak wykonać powłokę wbudowaną ze Scala

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

Niestety to nie działa dla poleceń wbudowanych. Czy istnieje sposób na wychwytywanie danych wyjściowych z powłoki wbudowanej w Scala?

Aktualizacja:

Próbowałem zwykłą sztuczkę sh -c "ulimit -n" w kilku formach bez powodzenia; Wszystkie poniższe polecenia nie powiedzie:

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

A ja dostaję błąd wykonania w 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

Czy wypróbowałeś to poza REPL, np. W skrypcie Scala? –

Odpowiedz

10

Kiedy ciągi są konwertowane na polecenia powłoki, parametry są oddzielone spacją. Konwencje, które wypróbowałeś, to konwencje muszla, więc aby je zastosować, potrzebujesz powłoki.

Jeśli chcesz mieć większą kontrolę nad tym, co każdy parametr jest używanie Seq[String] zamiast String, lub jedna z fabryk Process że kwota do tej samej rzeczy. Na przykład:

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

To wszystko! Dzięki :) – nab

4

użytkowania

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

naśladować to, co normalnie robi powłoki po wprowadzeniu sh -c 'ulimit -n'. Oznacza to, że komendą jest sh, a argumentami są -c i ulimit -n.

Powiązane problemy