2012-07-23 7 views
7

से खोल निर्मित को निष्पादित करने के लिए मुझे लिनक्स में स्कैला स्क्रिप्ट से ulimit -n जैसी कुछ सिस्टम सेटिंग्स की जांच करने की आवश्यकता है। मैं साधारण आदेशों का सामना करना पड़ा रहा scala.sys.process पैकेज का उपयोग करना चाहते हैं:स्कैला

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

दुर्भाग्य से इस खोल builtins के लिए काम नहीं करता। क्या स्कैला में शैल बिल्टिन से आउटपुट पकड़ने का कोई तरीका है?

अद्यतन:

मैं कोई भाग्य के साथ कई रूपों में सामान्य चाल sh -c "ulimit -n" की कोशिश की, नीचे दिए गए सभी आदेशों असफल:

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

और मैं आरईपीएल में एक रनटाइम त्रुटि हो रही है:

-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

क्या आपने इसे आरपीएल के बाहर आज़माया था, उदाहरण के लिए, स्कैला स्क्रिप्ट में? –

उत्तर

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 है और तर्क -c और ulimit -n हैं।