2008-10-02 11 views
19

मैं इनपुट के रूप में स्ट्रिंग का उपयोग करके बैश का आह्वान करना चाहता हूं। कुछ ऐसा:getRuntime() के भीतर उद्धरणों का उपयोग करना। Exec

sh -l -c "./foo" 

मैं जावा से ऐसा करना चाहता हूं।

 foo": -c: line 0: unexpected EOF while looking for matching `"' 

     foo": -c: line 1: syntax error: unexpected end of file 

यह मेरी स्ट्रिंग एक EOF के साथ समाप्त नहीं किया जा रहा करने के लिए संबंधित प्रतीत होती है: दुर्भाग्य से, जब मैं आदेश getRuntime().exec का उपयोग कर को लागू करने की कोशिश करते हैं, मैं निम्नलिखित त्रुटि मिलती है।

जावा स्ट्रिंग में प्लेटफार्म विशिष्ट ईओएफ डालने का कोई तरीका है? या मुझे "sh" का आह्वान करने से पहले एक अस्थायी स्क्रिप्ट को लिखने की तरह, एक और दृष्टिकोण की तलाश करनी चाहिए?

+0

क्या आपको संकलन समय या रन समय पर त्रुटि मिलती है? –

+0

आपके द्वारा उपयोग किए जाने वाले जावा कोड का उपयोग बैश का आह्वान करने के लिए किया जाता है? आपके द्वारा जावा कोड में उपयोग किए जाने वाले तार गलत लगते हैं। दुर्भाग्यवश, वे पोस्ट में गायब हैं, जिससे यह विशेष रूप से उपयोगी नहीं है ... – oberlies

उत्तर

39

उपयोग करें:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"}); 

मुख्य बिंदु: में दोहरे उद्धरण चिह्नों डाल नहीं है कि केवल प्रयोग किया जाता है जब खोल में एक कमांड लाइन लेखन।! ।

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"}); 

(बस पल कि खोल सामान्य रूप से echo के लिए अंतर्निहित है, और बजाय /bin/echo बुला रहा है के लिए भूल जाते हैं :-):

जैसे, echo "Hello, world!" (शेल में टाइप के रूप में) में अनुवाद किया जाता है)

4

ईओएफ एक चरित्र नहीं है, इसलिए ईओएफ लिखने का कोई तरीका नहीं है। आप उद्धृत स्ट्रिंग को बंद करना भूल गए हैं।

0

इस त्रुटि का कारण सबसे अधिक संभावना है कि एक लापता सिंटैक्स टोकन है जो बैश की अपेक्षा करता है लेकिन आपके द्वारा पारित होने वाली स्ट्रिंग का सामना करने से पहले समाप्त होता है। आईएफएस, फोर्स इत्यादि की तलाश करें जिनके पास कोई समापन या पूर्ण कार्य नहीं है।

0

स्ट्रिंग के अंदर उद्धरणों से बचने की आवश्यकता है। लिखने के बजाय "लिखें \"।

उदा।

strcpy (सी, "यह एक स्ट्रिंग \" \ "उद्धरण" के साथ है);

7

यूनिक्स, मैक ओएस एक्स और जीएनयू/लिनक्स से विंडोज कमांड लाइन अलग-अलग हैं।

विंडोज़ पर प्रक्रिया निष्पादन योग्य नाम (और स्थान) के बाद इनपुट टेक्स्ट प्राप्त करती है। यह तब कमांड लाइन को पार्स करने के लिए कार्यक्रम तक है (जिसे आम तौर पर पूर्ण रूप से किया जाता है और प्रोग्रामर अक्सर अनजान होता है)।

जीएनयू/लिनक्स में खोल कमांड लाइन को संसाधित करता है और सी के मुख्य भाग में तारों की परिचित सरणी को ग्रीन करता है। आपके पास वह खोल नहीं है। सबसे अच्छा तरीका (यहां तक ​​कि विंडोज़ पर) निष्पादन के रूप में उपयोग करना है जहां आप प्रत्येक स्ट्रिंग लाइन तर्क को अपने स्वयं के स्ट्रिंग में अलग-अलग पास करते हैं।

यदि आप वास्तव में चाहते थे तो आप अपने लिए पार्सिंग के लिए एक खोल प्राप्त कर सकते हैं। कौन सा कर आप उदाहरण (untested) कुछ ऐसा दिखाई देगा:

Runtime.getRuntime().exec(new String[] { 
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\"" 
}); 
0

अगर मैं तुम्हें थे, मैं एक अस्थायी bashfile को स्ट्रिंग की सामग्री को लिखते थे और देखें कि क्या पार्टी को निष्पादित करता है कि किसी भी त्रुटि के बिना। अगर यह किसी त्रुटि के बिना निष्पादित करता है, तो मैं आगे डीबगिंग पर विचार करूंगा;

संबंधित मुद्दे