سؤال

لدي مهام أشعل النار في تطبيق Rails الخاص بي. أريد تشغيل أوامر سطر الأوامر مع مهمة Rake. كيف يمكنني أن أفعل هذا. حاولت بما يلي ولكن فشلت

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

رميات Run Run Trows Method غير محددة وعدم إلقاء أي أخطاء ولكن لم يتم تنفيذها.

هل كانت مفيدة؟

المحلول

قد تساعدك هذه الروابط في تشغيل أمر سطر الأوامر في Ruby ...

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

استدعاء أوامر شل من روبي

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

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

نصائح أخرى

ال sh أشعل النار مدمج ربما تكون أفضل طريقة:

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

الواجهة مشابهة ل Kernel.system لكن:

  • يتم إحباط إذا كانت العودة! = 0 ، لذلك لا تصل أعلاه أبدًا echo b
  • يردد الأمر نفسه قبل الإخراج

run يستخدم من قبل Capistrano وأشياء أخرى لإطلاق الأوامر ، ولكن Rake غالبا ما تستخدم Kernel#system في حين أن.

قد يتم تشغيل أمرك ، ولكن لا يعمل. لماذا لا تصنع برنامج نصي غلاف Shell يمكنك اختباره بشكل مستقل ، أو محاولة البدء باستخدام المسار الكامل:

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 على النجاح. إذا لم تكن هذه هي الحالة ، فلا يتم تشغيل البرنامج النصي إلى رمز خطأ ، أو أنه لا يمكن تشغيل الأمر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top