2012-07-23 6 views
7

리눅스의 스칼라 스크립트에서 ulimit -n과 같은 시스템 설정을 확인해야합니다.Scala에서 쉘 내장 명령을 실행하는 방법

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

불행하게도이 쉘 내장 명령이 작동하지 않습니다 :처럼 평범한 명령을 처리했다 나는 scala.sys.process 패키지를 사용합니다. 스칼라에 내장 된 쉘에서 출력물을 잡을 방법이 있습니까?

업데이트 :

내가 운이 여러 형태로 일반적인 트릭 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) 
+0

예를 들어 Scala 스크립트에서 REPL 외부에서 사용해 보셨습니까? –

답변

10

이 매개 변수는 공백으로 구분된다. 시도한 규칙은 규칙이므로 적용하기 위해 쉘을 사용해야합니다.

각 매개 변수의 제어를 원하는 경우 String 대신 Seq[String]을 사용하거나 동일한 항목의 공장 Process 중 하나를 사용하십시오. 예를 들어 :

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

그게 다야! 감사 :) – nab

4

사용

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

sh -c 'ulimit -n'를 입력하면 쉘이 일반적으로 무엇을 모방합니다. 즉, 명령은 sh이고 인수는 -culimit -n입니다.

관련 문제