2012-04-13 10 views
44

मुझे पता है की तरह रूबी में एक शेल कमांड को चलाने के लिए कैसे:रूबी किसी विशिष्ट निर्देशिका की रन शेल कमांड

%x[#{cmd}] 

लेकिन, मैं कैसे इस आदेश को चलाने के लिए कोई निर्देशिका निर्दिष्ट करते हैं?

वहाँ बाहर बमबारी की एक ऐसी ही रास्ता है, पायथन में subprocess.Popen के समान:

subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local') 

धन्यवाद!

उत्तर

109

आप Dir.chdir के ब्लॉक-संस्करण का उपयोग कर सकते हैं। भी

Dir.chdir('mydir'){ 
    %x[#{cmd}] 
} 
+3

+1 ऐसा लगता है कि बहुत कम रूबी प्रोग्रामर इस बारे में जानते हैं। – Phrogz

+5

रूबी इस तरह की चीजें ब्लॉक के साथ करता है मुझे कभी आश्चर्यचकित नहीं करना बंद कर देता है। रूबी लगातार मेरी अन्य भाषाओं को घबराहट और जटिल महसूस करती है। – bta

+0

यह आश्चर्यजनक है, क्या मुझे केवल इस बारे में पता था! – ZirconCode

10

रूबी 1.9.3 (अवरुद्ध कॉल):

require 'open3' 
Open3.popen3("pwd", :chdir=>"/") {|i,o,e,t| 
    p o.read.chomp #=> "/" 
} 

Dir.pwd #=> "/home/abe" 
1

शायद यह सबसे अच्छा समाधान नहीं है, लेकिन Dir.pwd उपयोग करने के लिए वर्तमान निर्देशिका हो और इसे कहीं बचाने के लिए प्रयास करें। इसके बाद Dir.chdir (गंतव्य) का उपयोग करें, जहां गंतव्य एक निर्देशिका है जहां आप अपना आदेश चलाने के लिए चाहते हैं। आदेश को चलाने के बाद, इसे पुनर्स्थापित करने के लिए पहले सहेजी गई निर्देशिका का उपयोग करके, Dir.chdir को दोबारा उपयोग करें।

+2

आप 'Dir.chdir' के ब्लॉक-संस्करण का भी उपयोग कर सकते हैं। ब्लॉक के अंदर आप अनुरोधित निर्देशिका में हैं, ब्लॉक के बाद भी आप पिछली निर्देशिका में हैं। – knut

+0

@knut आपको इसे एक उत्तर देना चाहिए - मुझे यह पसंद है! मैं 'Dir.chdir (Dir.pwd.tap {Dir.chdir (' d: \ test \ local '); #otherstuff} जैसे पागल कुछ सुझाव देने जा रहा था)' क्योंकि मुझे पता नहीं था कि चडीर ब्लॉक –

+0

ले सकता है @AbeVoelker आप सही हैं, [यहां यह है] (http://stackoverflow.com/a/10148325/676874) – knut

4

, खोल मार्ग लेने

%x[cd #{dir} && #{cmd}] 
1

मैं इस एक ही समस्या थी और द्वारा इसे हल: ब्लॉक का अनुरोध आपने किया निर्देशिका में हैं अंदर, ब्लॉक के बाद आप अब भी पिछले निर्देशिका में हैं वापस टिक में दोनों आदेशों डालने और '& &' से अलग करते हुए:

`cd \desired\directory && command` 
1

निकटतम सुरक्षित बदलते dir के साथ मैं backtricks को देख रहा है capture2:

require 'open3' 
output, status = Open3.capture2('pwd', :chdir=>"/tmp") 

आप गहरे लाल रंग का डॉक्स में अन्य उपयोगी Open3 तरीकों देख सकते हैं। एक दोष यह है कि open3 के लिए समर्थन बल्कि टूटा हुआ है।

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