2012-11-01 3 views
9

से पैरामीटर के साथ खोल-स्क्रिप्ट निष्पादित करना मैं कुछ समय के लिए googling रहा है, और हर कोई एक अलग समाधान लगता है, जिनमें से कोई भी मेरे लिए काम नहीं कर रहा है।जावा

मैंने ProcessBuilder और Runtime दोनों की कोशिश की है। दोनों .sh फ़ाइल को सीधे कॉल करते हैं और इसे /bin/bash पर खिलाते हैं। कोई भाग्य के साथ।

मूल बातें पर वापस, मेरा वर्तमान कोड निम्नानुसार है;

String cmd[] = { "~/path/to/shellscript.sh", "foo", "bar" }; 
Process p = Runtime.getRuntime().exec(cmd); 

जो एक No such file or directory त्रुटि दे रहा है, कि मैन्युअल चल बावजूद;

~/path/to/shellscript.sh foo bar 

पूरी तरह से बैश से काम करता है।

मुझे ~ रखने की आवश्यकता है क्योंकि यह शेलस्क्रिप्ट तीन अलग-अलग उपयोगकर्ताओं के लिए थोड़ा अलग रूपों में मौजूद है।

उत्तर

11

एक विकल्प को संभालने के लिए है ~ खुद:

String homeDir = System.getenv("HOME"); 
String[] cmd = { homeDir + "/path/to/shellscript.sh", "foo", "bar" }; 
Process p = Runtime.getRuntime().exec(cmd); 

एक और बैश आप के लिए इसे संभाल जाने के लिए है:

String[] cmd = { "bash", "-c", "~/path/to/shellscript.sh foo bar" }; 
Process p = Runtime.getRuntime().exec(cmd); 
+0

आह, है '~' के कारण समस्याओं आपको लगता है कि होने की संभावना? क्या जावा नहीं जानता कि सिस्टम कॉल के लिए इस तरह के पथ को कैसे पास किया जाए? – lynks

+0

हां, सबसे अधिक संभावना ~ कारण है। यदि आपके द्वारा सुझाए गए अनुसार उपयोगकर्ता प्रति लिपि एक ही सापेक्ष पथ में उसी निर्देशिका में है, या प्रति उपयोगकर्ता कॉन्फ़िगर किया गया पथ है, तो उपर्युक्त सुझाव हो सकता है। –

+0

दूसरा सुझाव पूरी तरह से काम किया, धन्यवाद। मैंने '~' – lynks

1

सामान्य तौर पर, मैं सुझाव है कि आप System.getRuntime की ScriptEngine बजाय का उपयोग()। Exec
मुझे लगता है कि यह आप के लिए चीजों को अधिक आसान कर देगा।
ध्यान रखें कि आपको इस जेडीके 6 और उसके बाद की आवश्यकता है।
इसके अतिरिक्त, आपकी विशिष्ट समस्या के संबंध में - मुझे सच में लगता है कि यह समस्या कॉन्फ़िगर करने योग्य होनी चाहिए। से
निर्यात MY_SCRIPT =


बी पढ़ें इस मूल्य:
ए (प्रत्येक उपयोगकर्ता के लिए) अपने .bash_rc या .bash_profile में है का उपयोग कर विन्यास
स्क्रिप्ट के लिए पथ को परिभाषित:
आप निम्न कर सकते हैं जावा कोड, मूल्य प्राप्त करने के लिए
String sciprtPath = System.getenv("MY_SCRIPT") का उपयोग कर।
सी। स्क्रिप्ट चलाएं, जिस तरह से आपने अपने कोड में किया था, स्क्रिप्टपैथ चर के साथ, या scriptEngine का उपयोग कर।

2

पहले से ही उल्लेख किया है, टिल्ड एक खोल विशेष विस्तार जो होना चाहिए इसे वर्तमान उपयोगकर्ता की होम निर्देशिका के साथ मैन्युअल रूप से संभाला जाता है (उदाहरण के लिए $HOME परिभाषित होने पर)।

इसके अलावा समाधान पहले से ही दिए गए हैं, आप भी Apache Commons परियोजना से commons-io और commons-exec उपयोग करने पर विचार हो सकता है:

... 
import org.apache.commons.exec.CommandLine; 
import org.apache.commons.exec.DefaultExecutor; 
import org.apache.commons.exec.Executor; 
import org.apache.commons.io.FileUtils; 
... 
CommandLine cmd = new CommandLine("path/to/shellscript.sh"); 
cmd.addArgument("foo"); 
cmd.addArgument("bar"); 

Executor exec = new DefaultExecutor(); 
exec.setWorkingDirectory(FileUtils.getUserDirectory()); 
exec.execute(cmd); 
...