2010-09-08 10 views
13

मेरे पास मेरे रेल आवेदन में रेक कार्य हैं। मैं रेक कार्य में एक कमांडलाइन कमांड चलाने के लिए चाहता हूँ। मैं यह कैसे कर सकता हूँ। मैं का पालन करते हुए कोशिश की, लेकिन विफल रहता हैरेक कार्यों के भीतर आदेश कैसे निष्पादित करें?

desc "Sending the newsletter to all the users" 
task :sending_mail do 
    run "cd #{RAILS_ROOT} && ar_sendmail -o -t NewsLetters -v" 
    system "cd #{RAILS_ROOT} && ar_sendmail -o -t NewsLetters -v &" 
end 

ऊपर रन कमांड थ्रो चलाने विधि & प्रणाली किसी भी त्रुटि फेंक नहीं आदेश अपरिभाषित लेकिन निष्पादित नहीं।

उत्तर

5

यह लिंक मदद मिल सकती है आप रूबी में कमांड लाइन आदेश चला ...

http://zhangxh.net/programming/ruby/6-ways-to-run-shell-commands-in-ruby/

Calling shell commands from Ruby

http://blog.jayfields.com/2006/06/ruby-kernel-system-exec-and-x.html

%x[command].each do |f| 
    value = f 
end 
+0

रैक एक शेल कमांड चलाने के लिए एक विशिष्ट विधि है,' # sh'। इसमें '/ bin/sh' का उपयोग करने की कमी है, हालांकि बाश नहीं है। रेक की 'sh' विधि से बैश का उपयोग करने के लिए, यह उत्तर डुप्लिकेट प्रश्न पर देखें: https: // stackoverflow।कॉम/प्रश्न/9796028/execute-bash-command-from-a-rakefile/34523379 # 34523379 –

5

run कैपिस्ट्रानो और कमांड लॉन्च करने के लिए अन्य चीजों द्वारा उपयोग किया जाता है, लेकिन रेक अक्सर इसके बजाय Kernel#system का उपयोग करता है।

आपका आदेश चलाया जा सकता है, लेकिन काम नहीं कर रहा है।

newsletter_script = File.expand_path('ar_sendmail', RAILS_ROOT) 

if (File.exist?(newsletter_script)) 
    unless (system(newsletter_script + ' -o -t NewsLetters -v &')) 
    STDERR.puts("Script #{newsletter_script} returned error condition") 
    end 
else 
    STDERR.puts("Could not find newsletter sending script #{newsletter_script}") 
end 

यह अजीब प्रतीत होता है अपनी स्क्रिप्ट के लिए नहीं scripts/

में system कॉल true लौटना चाहिए: क्यों आप स्वतंत्र रूप से परीक्षण कर सकते हैं, या कोशिश करते हैं और पूर्ण पथ का उपयोग शुरू एक आवरण खोल स्क्रिप्ट नहीं बना सफलता पर यदि यह मामला नहीं है, तो स्क्रिप्ट ने एक त्रुटि कोड वापस कर दिया है, या आदेश चलाया नहीं जा सका।

+0

हाय tadman, धन्यवाद आपके उत्तर के लिए ... मैं सिर्फ अपने कोड की नकल की और कोशिश की, लेकिन के रूप में expected..can क्या आप मुझे बता क्या File.expand_path कर रहा है काम नहीं कर रहा? – palani

+0

हैलो टैडमैन, आपकी स्क्रिप्ट फ़ाइल Rails_Root/ar_sendmailer की तलाश में है। लेकिन यह एक फ़ाइल नहीं है और यह वह आदेश है जो रेल ऐप रूट फ़ोल्डर से जुड़ा हुआ है। जैसे [/ home/username/railsapp] $ ar_sendmail -o -t NewLetter -V। तो मैं घूस फ़ाइल मैं रेल आवेदन रूट फ़ोल्डर जाने के लिए और उपरोक्त आदेश को गति प्रदान कि मैं क्या जरूरत है ... कृपया मुझे पर मदद इस – palani

+0

'File.expand_path', मूल रूप से करने के लिए ... रास्तों का विस्तार किया जाता है। यह आपके रेल मार्ग पर 'ar_sendmail' को जोड़ने जैसा कुछ भी सही ढंग से दो पथों में शामिल होगा, जो भी हो। यह आवश्यक होने पर '../../' जैसी चीज़ों को खत्म करने के लिए भी अच्छा है, आपको उचित, पूर्ण पथ प्रदान करना। – tadman

26

sh रैक में निर्मित शायद है सर्वोत्तम विधि:

task(:sh) do 
    sh('echo', 'a') 
    sh('false') 
    sh('echo', 'b') 
end 

इंटरफ़ेस Kernel.system के समान है लेकिन:

  • यह रोकता है, तो वापसी है = 0, इसलिए ऊपर कभी नहीं पहुंचता है echo b
  • आदेश ही उत्पादन से पहले गूँजती है
  • !
+1

मुझे भी सबसे अच्छी विधि की तरह लगता है –

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