سطر أوامر روبي:كيف يمكنني إرسال الأمر CTRL-C عبر النص في سطر الأوامر؟

StackOverflow https://stackoverflow.com/questions/1616982

سؤال

أحاول إنشاء قطرة Automator بسيطة ستأخذ style.less تم إسقاط الملف فيه وتشغيل الأمر LESS التالي عليه:

$ LESSC {DROPPED_FILE} --watch

والتي ستقوم بمراقبة الملف الذي قمت بإسقاطه بحثًا عن أي تغييرات ثم ستقوم تلقائيًا بتحديث الملف الناتج style.css

لعِلمِكَ:أنا أستخدم LESS لكتابة ملفات CSS ديناميكيًا.مزيد من المعلومات هي هنا.

القطرة الأساسية تعمل بشكل رائع.

  1. يتم تمرير الملف المسقط إلى متغير.لهذا الغرض: {MY_VAR}.
  2. أقوم بتشغيل برنامج نصي Shell في ملف /usr/bin/ruby قذيفة على النحو التالي system("lessc {MY_VAR} --watch &")

يعمل هذا بشكل رائع ولكنني أريد إيقاف --watch عند الخروج من تطبيق الأتمتة.

تنص وثائق LESS على الضغط على اختصار CTRL-C أثناء وجودك في غلاف سطر الأوامر لإحباط البرنامج النصي.

لكن بما أنني لست داخل النافذة الطرفية (يتم تمرير الأمر في الخلفية) لا أعرف كيفية إلغاء البرنامج النصي.

حتى بعد إغلاق automator.app style.less لا يزال الملف قيد المراقبة بحثًا عن التغييرات ويتم إنشاءه وفقًا لذلك style.css لا يزال قيد إعادة الكتابة.

لذلك أحتاج في الأساس إلى تمرير أمر الإجهاض عند الخروج من التطبيق.

لقد قمت بإنشاء نافذة منبثقة بسيطة عند النقر عليها ستغلق التطبيق بعد تمرير أمر آخر إلى shell الطرفي.

هذا هو الجزء الذي لم تنجح فيه كل محاولاتي لإيقاف البرنامج النصي.

هل هناك وظيفة سطر أوامر تعمل بنفس طريقة الضغط على الأمر CTRL-C؟كيف يمكنني تمرير هذا الأفضل إلى Shell؟

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

المحلول

إذا قمت بالضغط على CTRL-C في وحدة التحكم الخاصة بك، فلن يتم إرسال هذا عبر STDIN إلى البرنامج الخاص بك.Bash (أو أي شيء تستخدمه) يعامل CTRL-C بشكل خاص.يرسل الباش إشارة إلى العملية.في حالة CTRL-C، فهذا هو SIGINT.لإرسال إشارة إلى برنامج ما، لا تحتاج إلى معرف pid الخاص به.ثم يمكنك إرسال الإشارة إلى معرف المنتج.لتتمكن من الحصول على معرف الهوية، يمكنك بدء العملية باستخدام روبي.

p= IO.popen("lessc #{file} --watch")
pid= p.pid
Process.kill("INT", pid)

يوجد في روبي ثلاث طرق مختلفة على الأقل لتنفيذ شيء ما.

`lessc #{file} --watch` # returns stdout after exit
system("lessc #{file} --watch") # returns the integer return value after exit
Io.popen("lessc #{file} --watch") # returns imidietly an io object, where STDIN and STDOUT can be written and read

استخدمته system("lessc #{file} --watch&") والذي يُرجع أيضًا بشكل غير مباشر ولكنه يُرجع دائمًا 0.

نصائح أخرى

تَلمِيح:ماذا يفعل ^C التحكم-C حقًا تفعل في قذيفة؟

(لا يرسل حرفًا).

توضيح على التلميح:هذا يتحدث PDF عن الإشارات.لاحظ أين يتحدث أيضًا عن ^C.يمكنك إرسال إشارة يدويًا كما هو مطلوب.

عندما تضغط على ^C في الوحدة الطرفية، فإنه عادةً ما يرسل إشارة SIGINT إلى البرنامج قيد التشغيل.يمكنك إرسال هذه الإشارات في روبي أيضًا.مزيد من المعلومات حول العمل مع العمليات (وإرسال الإشارات) في روبي: http://whynotwiki.com/Ruby_/_Process_management.

ترميز سعيد.

أعتقد أن less ينتهي أيضًا عندما يتلقى الحرف "q".

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