سؤال

أنا أتعلم كتابة نصوص TCL (توقع) وألاحظ أن بعض الأمثلة تظهر لاستخدام تفرخ، في حين أن البعض الآخر يظهر الأمر exec. حاولت googling، ولكن لا يمكن العثور على الفرق؟

لنفترض أنني استدعاء "EXEC" في منتصف سيناريو يتوقع طويلا، ما الذي يمكن أن أتوقع حدوثه؟

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

المحلول

spawn هو expect القيادة ليست أ tcl أمر. exec هو tcl أمر.

spawn يخلق عملية. يتم توصيل العمليات "المدخلات والإخراج" بتوقع استخدامها من قبل الأوامر الأخرى: send, expect و interact.

exec يخلق فرعية تحت TCL. بشكل عام يتم تعليق TCL حتى يكمل البرنامج الفرعي. ومع ذلك، واحد يمكن قم بإنشاء الإعالة الفرعية في الخلفية (باستخدام وسيطة الأخيرة) وإذا كان المرء يرفع الإدخال والإخراج بشكل صحيح، فيمكن أن تتفاعل TCL مع الإعداد الفرعي. هذا خرقاء للغاية وهو بالضبط تم تصميم نوع التفاعل الذي يتوقع أن يتعامل معه بسلاسة.

نصائح أخرى

تتم إعادة صياغة طريقة أبسط للإجابة على السؤال أن نسأل متى يجب عليك استخدام EXEC VS Spawn. باختصار، استخدم Spawn للأوامر التفاعلية والإبرام لأوامر غير تفاعلية.

تجدر الإشارة أيضا إلى أن بعض البرامج (كثير؟) تتصرف بشكل مختلف عند تشغيل مستخدم (أي في سطر الأوامر) مقابل كونها جزءا من عملية دفعة / تشغيل من عملية أخرى. الفرق الفعلي هو ما إذا كان هناك محطة مرتبطة بالعملية.

يقوم الأمر Spawn، جزء من التمديد بتوقع TCL، يضع الأمور حتى يرى البرنامج المنفذ نفسه على أنه يديره مستخدم، ثم يضيف وظائف للسماح ببرنامج TCL بالتفاعل مع البرنامج الخارجي بطريقة مريحة (IE، مطابقة إنه إخراج عبر التعبيرات العادية وفرع قبالة تلك المباريات). يتم تشغيل الأمور عبر Spawn بشكل غير متزامن.

أمر EXEC هو أمر TCL الأساسي الذي يقوم بتشغيل البرنامج الآخر، وإرجاع إخراجه. لا يقوم بأي من الإعداد المعقد الذي يفرز به، ولكن يمكن أن يكون مفيدا للغاية لتشغيل برنامج ورؤيته إخراجه (وهو رمز الإرجاع). يتم تشغيل الأشياء التي تعمل بواسطة EXEC، بشكل افتراضي، تشغيل متزامن، لكن أمبير في نهاية الأمر يؤدي إلى تشغيله في الخلفية (مثل البرمجة النصية الشل التقليدية).

يمكن أيضا استخدام الأمر المفتوح، بينما تستخدم عموما لقراءة / كتابة الملفات، لتشغيل العمليات الخارجية. من خلال تسبق اسم الأمر مع رمز الأنابيب (|)، فأخبرها بتشغيل عملية خارجية، والوصول إلى بيانات الملفات للقراءة / كتابة للتفاعل مع العملية الناتجة. هذا هو نوع من الأرض الوسطى بين Exec و Spawn، مع تفاعل أكثر بكثير مع العملية المتاحة، ولكن دون الإعداد البيئي المعقد الذي يفرز. يمكن أن يكون مفيدا للغاية للتفاعل مع البرامج التي تتطلب إدخال ولكن لا تزال إعداد جيدا إلى حد ما للأتمتة.

بقدر ما أعرف، إرجاع تفرخ معرف عملية (وروابط بتوقع)، في حين أن EXEC فقط إرجاع Stdout النهائي، إلا إذا قمت بتمرير "&". لذلك لن يؤثر على توقعاتك.

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