توقعات لينكس / يونكس

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

Expectk هو خليط من التوقعات وتك. يتصرف مثل رغبة توقع وتك. ويمكن أيضا أن تستخدم توقع مباشرة في C أو C ++ دون Tcl.

يأتي اسم "Expect" من فكرة تسلسل الإرسال / التوقع الذي تم تعميمه بواسطة uucp و kermit وبرامج تحكم المودم الأخرى. ولكن بخلاف uucp ، فإن Expect يتم تعميمه بحيث يمكن تشغيله كأمر على مستوى المستخدم مع وضع أي برنامج ومهمة في الاعتبار. يمكن توقع التحدث إلى عدة برامج في نفس الوقت.

ما الذي يمكن أن يفعله

على سبيل المثال ، إليك بعض الأشياء التي يمكن أن يؤديها أمر المتوقعة:

هناك مجموعة متنوعة من الأسباب التي تجعل shell غير قادر على تنفيذ هذه المهام. كل شيء ممكن مع توقع.

بشكل عام ، يعتبر Expect مفيدًا لتشغيل أي برنامج يتطلب التفاعل بين البرنامج والمستخدم. كل ما هو ضروري هو أن التفاعل يمكن أن يتميز برمجيا. يمكن أن يستعيد أيضًا التحكم في المستخدم دون إيقاف البرنامج الذي يتم التحكم فيه. وبالمثل ، يمكن للمستخدم إعادة التحكم في البرنامج النصي في أي وقت.

استعمال

نتوقع قراءة cmdfile لقائمة الأوامر للتنفيذ. قد يتم استدعاء التوقع ضمنيًا على الأنظمة التي تدعم #! الترميز عن طريق وضع علامة على البرنامج النصي على أنه قابل للتنفيذ وجعل السطر الأول في البرنامج النصي:

#! / usr / local / bin / expect -f

بالطبع ، يجب أن يصف المسار بدقة أين تتوقع الحياة. / usr / local / bin هو مجرد مثال.

تعيّن العلامة -c أمرًا يتم تنفيذه قبل أي نص في النص البرمجي. يجب ذكر الأمر لمنع الانفصال عن طريق القشرة. يمكن استخدام هذا الخيار عدة مرات. قد يتم تنفيذ أوامر متعددة مع واحد -c بفصلها بفواصل منقوطة. يتم تنفيذ الأوامر بالترتيب الذي تظهر به. عند استخدام Expectk ، يتم تحديد هذا الخيار كمطابقة.

تمكّن العلامة -d بعض الإخراج التشخيصي ، الذي يُبلغ في المقام الأول عن الأنشطة الداخلية للأوامر مثل توقع وتفاعل. هذه العلامة لها نفس التأثير مثل "exp_internal 1" في بداية البرنامج النصي Expect ، بالإضافة إلى طباعة إصدار Expect.

تمكّن العلامة -D مصحح أخطاء تفاعلي. يجب أن تتبع قيمة عددية. سيتحكم المصحح قبل الإجراء Tcl التالي إذا كانت القيمة غير صفرية أو إذا تم الضغط على ^ C أو عندها يتم تسجيل نقطة توقف ، أو ظهور أمر مصحح مناسب آخر في البرنامج النصي. عند استخدام Expectk ، يتم تحديد هذا الخيار كـ Debug.

تعيّن العلامة -f ملفًا يمكن من خلاله قراءة الأوامر. العلم نفسه اختياري لأنه مفيد فقط عند استخدام #! تدوين ، بحيث قد يتم توفير الوسائط الأخرى على سطر الأوامر. عند استخدام Expectk ، يتم تحديد هذا الخيار كـ -file.

بشكل افتراضي ، يتم قراءة ملف الأوامر في الذاكرة وتنفيذها بالكامل. من المستحسن أحيانًا قراءة ملفات سطر واحد في كل مرة. من أجل فرض معالجة الملفات التعسفية بهذه الطريقة ، استخدم علامة -b. عند استخدام Expectk ، يتم تحديد هذا الخيار على أنه -buffer.

إذا تم توفير السلسلة "-" كإسم ملف ، تتم قراءة الإدخال القياسي بدلاً من ذلك. استخدم "./-" للقراءة من ملف تمت تسميته بالفعل "-".

السبب -i flag تتوقع المطالبة بشكل تفاعلي للأوامر بدلاً من قراءتها من ملف. يتم إنهاء المطالبة عبر الأمر exit أو على EOF. يفترض العلم -i إذا لم يتم استخدام ملف أمر ولا c -. عند استخدام Expectk ، يتم تحديد هذا الخيار على أنه -interactive.

- يمكن استخدامها لتحديد نهاية الخيارات. يكون هذا مفيدًا إذا كنت ترغب في تمرير وسيطة تشبه الخيار إلى النص البرمجي دون أن يتم تفسيره بواسطة Expect. يمكن وضع هذا بشكل مفيد في #! خط لمنع أي تفسير علمي من قبل توقع. على سبيل المثال ، سيترك التالي الوسيطات الأصلية بما في ذلك اسم البرنامج النصي في متغير argv .

#! / usr / local / bin / expect -

لاحظ أنه يجب مراعاة عادة getopt (3) و execve (2) عند إضافة الوسيطات إلى #! خط.

يتم الحصول على الملف $ exp_library / expect.rc تلقائيًا إذا كان موجودًا ، إلا إذا تم استخدام العلامة -N. (عند استخدام Expectk ، يتم تحديد هذا الخيار كـ -NORC). بعد ذلك مباشرة ، يتم الحصول على الملف ~ / .expect.rc تلقائيًا ، ما لم يتم استخدام العلامة -n. إذا تم تعريف متغير بيئة DOTDIR ، فإنه يتم التعامل معه كدليل و. expect.rc يقرأ من هناك. عند استخدام Expectk ، يتم تحديد هذا الخيار كـ -norc. هذا المصدر يحدث فقط بعد تنفيذ أي أعلام -c.

أسباب -v تتوقع طباعة رقم الإصدار الخاص به والخروج. علم المقابلة في Expectk ، والذي يستخدم أسماء العلم طويلة ، هو -version.

يتم إنشاء args الاختياري في قائمة وتخزينها في المتغير المسمى argv و. يتم تهيئة argc لطول argv.

يتم تعريف Argv0 ليكون اسم البرنامج النصي أو ثنائي إذا لم يتم استخدام أي برنامج نصي. على سبيل المثال ، تقوم المطبوعات التالية بإخراج اسم البرنامج النصي والوسائط الثلاثة الأولى:

send_user "$ argv0 [lrange $ argv 0 2] \ n"

الأوامر

تتوقع استخدام أداة لغة الأوامر. يوفر Tcl تدفق التحكم (إذا ، ل ، كسر) ، وتقييم التعبير والعديد من الميزات الأخرى مثل تعريف الإجراء recursionand. الأوامر المستخدمة هنا ولكن لم يتم تعريفها (set، if، exec) هي أوامر Tcl. نتوقع يدعم أوامر إضافية. ما لم يتم تحديد خلاف ذلك ، تقوم الأوامر بإرجاع السلسلة الفارغة.

يتم سرد الأوامر أبجديًا بحيث يمكن تحديد موقعها بسرعة. ومع ذلك ، قد يجد المستخدمون الجدد أنه من الأسهل البدء في قراءة أوصاف البيضة وإرسالها وتوقعها والتفاعل معها بهذا الترتيب.

close [-slave] [-onexec 0 | 1] [-i spawn_id]

يغلق الاتصال إلى العملية الحالية. معظم البرامج التفاعلية ستكشف عن EOF على stdin والخروج. هكذا إغلاق تكفي عادة لقتل العملية كذلك. تعلن العلامة -i العملية لإغلاق المقابلة spawn_id المسماة.

كل من توقع وتفاعل سيكشف عندما تخرج العملية الحالية ويقترب ضمنا ، ولكن إذا قمت بقتل العملية ، على سبيل المثال ، "exec kill $ pid" ، فعليك أن تتصل بشكل صريح .

تحدد العلامة -onexec ما إذا كان معرّف التزاوج مغلقًا في أي عمليات جديدة منتجة أو إذا كانت العملية متراكبة. لترك معرف spawn مفتوحًا ، استخدم القيمة 0. تفرض قيمة عدد صحيح غير صفري على البيضة مغلقة في أي عمليات جديدة.

يغلق العلم -Slave الرقيق المرتبط بمعرف تفرخ. عندما يتم إغلاق الاتصال ، يتم إغلاق العبد تلقائيًا إذا كان لا يزال مفتوحًا.

بغض النظر عما إذا كان الاتصال مغلقًا ضمنيًا أم صريحًا ، يجب أن تنتظر الانتظار لمسح فتحة معالجة kernel المطابقة. لا يستدعي الأمر إغلاق الانتظار نظراً لعدم وجود ضمان أن إغلاق عملية اتصال سيؤدي إلى إنهاء.

debug [[-now] 0 | 1]

يتحكم في مصحح الأخطاء Tcl مما يسمح لك بالمرور عبر عبارات وتعيين نقاط التوقف.

بدون وسائط ، يتم إرجاع 1 إذا لم يتم تشغيل المصحح ، وإلا يتم إرجاع 0.

مع وسيطة 1 ، يتم بدء تشغيل المصحح. باستخدام وسيطة 0 ، يتم إيقاف مصحح الأخطاء. إذا كانت مسبوقة 1 مسبوقة بعلامة -now ، يتم تشغيل مصحح الأخطاء مباشرة. وإلا ، يتم بدء تشغيل المصحح مع العبارة Tcl التالي.

لا يقوم الأمر debug بتغيير أي اعتراضات. قارن هذا ببدء "توقع" بعلامة -D.

يفصل أمر قطع الاتصال عملية متشعبة من الجهاز . يستمر في العمل في الخلفية. يتم إعطاء العملية مجموعة العمليات الخاصة بها. يتم إعادة توجيه I / O القياسي إلى / dev / null .

يستخدم الجزء التالي قطع الاتصال لمتابعة تشغيل البرنامج النصي في الخلفية.

إذا كان {[شوكة]! = 0} قم بإنهاء الفصل. . .

يقرأ البرنامج النصي التالي كلمة مرور ثم يقوم بتشغيل برنامج كل ساعة يتطلب كلمة مرور في كل مرة يتم تشغيلها. يقوم البرنامج النصي بإمداد كلمة المرور حتى لا تضطر إلى كتابتها مرة واحدة.

send_user "password؟ \" expect_user -re "(. *) \ n" لـ {} 1 {} {if {[fork]! = 0} {sleep 3600؛ continue} disconnect spawn priv_prog expect Password: send "$ expect_out ( 1 ، سلسلة) \ r ". . . ىخرج }

إن ميزة استخدام قطع الاتصال على ميزة التشغيل غير المتزامن shell (&) هي أن Expect يمكنه حفظ معلمات المطراف قبل الانفصال ثم تطبيقها فيما بعد على ptys جديدة. مع &،، ليس لدى الفرصة فرصة لقراءة معلمات الجهاز حيث أن الجهاز غير متصل بالفعل مع الوقت الذي يستقبل فيه Expect.

الخروج [-opts] [الحالة]

الأسباب توقع الخروج أو الاستعداد للقيام بذلك.

تؤدي العلامة -onexit إلى استخدام الوسيطة التالية كمعالج إنهاء. بدون وسيطة ، يتم إرجاع معالج الإنهاء الحالي.

The -noexit flag الأسباب تتوقع أن تستعد للخروج ولكن لا تتوقف عن التحكم في العودة إلى نظام التشغيل. يتم تشغيل معالج الإنهاء المعرفة من قبل المستخدم بالإضافة إلى معالجات Expect الداخلية الخاصة. لا ينبغي تنفيذ أي أوامر توقع إضافية. هذا مفيد إذا كنت تقوم بتشغيل Expect مع ملحقات Tcl الأخرى. يظل المترجم الحالي (والنافذة الرئيسية في بيئة المعارف التقليدية) حتى تتمكن ملحقات Tcl الأخرى من التنظيف. إذا تم استدعاء الخروج Expect 'مرة أخرى (قد يحدث هذا) ، لا يتم إعادة تشغيل معالجات.

عند الخروج ، يتم إغلاق جميع الاتصالات بالعمليات الناتجة. سيتم الكشف عن إغلاق كـ EOF بواسطة عمليات spawned. لا يأخذ الخروج أي إجراءات أخرى بخلاف ما يفعله الإجراء _exit (2) العادي. وبالتالي ، قد يستمر تشغيل العمليات الناتجة التي لم يتم التحقق من EOF. (هناك مجموعة متنوعة من الشروط الهامة لتحديد ، على سبيل المثال ، ما هي الإشارات التي سترسل عملية التفريغ ، ولكن هذه معتمدة على النظام ، وعادة ما يتم توثيقها تحت المخرج (3).) سيتم توريث العمليات التي تم تشغيلها التي تم تشغيلها بواسطة init.

يتم إرجاع الحالة (أو 0 إذا لم يتم تحديد) كحالة الخروج من Expect . يتم تنفيذ exit ضمنيًا في حالة الوصول إلى نهاية البرنامج النصي.

exp_continue [-continue_timer]
يسمح الأمر exp_continue لنفسه بمواصلة التنفيذ بدلاً من العودة كما هو معتاد. بشكل افتراضي ، يؤدي تعيين exp_continue إلى إعادة تعيين مؤقت الوقت. تمنع علامة -continue_timer الموقت من إعادة التشغيل. (راجع توقع الحصول على مزيد من المعلومات.)

قيمة exp_internal [-f]
تسبب أوامر أخرى لإرسال معلومات تشخيصية داخلية إلى Expect إلى stderr إذا كانت القيمة غير صفرية. يتم تعطيل هذا الإخراج إذا كانت القيمة 0. تتضمن معلومات التشخيص كل حرف تم تلقيه ، وكل محاولة تم إجراؤها لمطابقة الإخراج الحالي مقابل الأنماط.

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

تؤدي العلامة -info إلى إرجاع exp_internal لشرح أحدث الحجج غير المعلومات المقدمة.

exp_open [args] [-i spawn_id]
إرجاع معرف ملف Tcl الذي يتوافق مع معرف التفرخ الأصلي. يمكن بعد ذلك استخدام معرف الملف كما لو تم فتحه بواسطة الأمر المفتوح لـ Tcl. (يجب عدم استخدام معرف التفرُض. لا يجب تنفيذ الانتظار .

يترك العلم -leaveopen فتح معرف spawn للوصول من خلال أوامر "توقع". يجب تنفيذ انتظار على معرف تفرخ.

exp_pid [-i spawn_id]
إرجاع معرف العملية المطابق لعملية spawned الحالية. إذا تم استخدام العلامة -i ، يتوافق pID الذي تم إرجاعه مع معرف التفرُّغ المعطى.

exp_send
هو اسم مستعار للإرسال .

exp_send_error
هو اسم مستعار لـ send_error .

exp_send_log
هو اسم مستعار لـ send_log .

exp_send_tty
هو اسم مستعار لـ send_tty .

exp_send_user
هو اسم مستعار لـ send_user .

exp_version [[-exit] version]
مفيد لتأكيد أن البرنامج النصي متوافق مع الإصدار الحالي من Expect.

مع عدم وجود وسائط ، يتم إرجاع الإصدار الحالي من Expect . قد يتم بعد ذلك ترميز هذا الإصدار في البرنامج النصي الخاص بك. إذا كنت تعرف بالفعل أنك لا تستخدم ميزات الإصدارات الحديثة ، فيمكنك تحديد إصدار سابق.

تتألف الإصدارات من ثلاثة أرقام مفصولة بنقاط. الأول هو الرقم الرئيسي. مخطوطات مكتوبة لإصدارات من توقع برقم رئيسي مختلف ، من المؤكد أنها لن تعمل. يعرض exp_version خطأً إذا لم تتطابق الأرقام الرئيسية.

الثاني هو الرقم الثانوي. قد تعتمد البرامج النصية المكتوبة لإصدار برقم أصغر أكبر من الإصدار الحالي على بعض الميزات الجديدة وقد لا تعمل. exp_version تقوم بإرجاع خطأ إذا كانت الأرقام الرئيسية تتطابق ، ولكن الرقم الثانوي للبرنامج النصي أكبر من ذلك من تاريخ التشغيل.

الثالث هو رقم لا يلعب أي دور في مقارنة الإصدار. ومع ذلك ، فإنه يتم زيادة عندما يتم تغيير توزيع برنامج Expect بأي طريقة ، مثل وثائق إضافية أو تحسين. يتم إعادة تعيين إلى 0 عند كل إصدار ثانوي جديد.

باستخدام علامة -exit ، يتوقع طباعة خطأ ويخرج إذا كان الإصدار قديمًا.

نتوقع [[-opts] pat1 body1] ... [-opts] patn [bodyn]
ينتظر حتى يتطابق أحد الأنماط مع ناتج عملية التفريخ ، أو مرت فترة زمنية محددة ، أو يظهر ملف نهاية الملف. إذا كان الجسم النهائي فارغًا ، فقد يتم حذفه.

يتم استخدام أنماط من أحدث أمر expect_before ضمنيًا قبل أي أنماط أخرى. يتم استخدام أنماط من أحدث أمر expect_after ضمنيًا بعد أي أنماط أخرى.

إذا تطلبت الوسيطات إلى بيان التوقع بأكمله أكثر من سطر واحد ، فقد يتم "تحجيم" كل الوسيطات في واحد حتى تتجنب إنهاء كل سطر بخط مائل عكسي. في هذه الحالة ، ستحدث بدائل Tcl المعتادة على الرغم من الأقواس.

إذا كان النمط هو الكلمة الأساسية eof ، فسيتم تنفيذ النص المقابل عند نهاية الملف. إذا كان النمط هو المهلة الأساسية ، فسيتم تنفيذ النص المقابل عند انتهاء المهلة. إذا لم يتم استخدام الكلمة الأساسية timeout ، يتم تنفيذ إجراء خالية ضمني عند انقضاء المهلة. فترة المهلة الافتراضية هي 10 ثوانٍ ولكن قد يتم تعيينها ، على سبيل المثال إلى 30 ، بواسطة الأمر "set timeout 30". قد يتم تعيين مهلة لانهائية بواسطة القيمة -1. إذا كان النمط هو الافتراضي للكلمة الرئيسية ، فسيتم تنفيذ النص المقابل عند انتهاء المهلة أو نهاية الملف.

إذا تطابق النقش ، فسيتم تنفيذ النص المقابل. نتوقع إرجاع نتيجة الجسم (أو السلسلة الفارغة في حالة عدم تطابق أي نمط). في حالة تطابق أنماط متعددة ، يتم استخدام النموذج الذي يظهر أولاً لتحديد الجسم.

في كل مرة يصل فيها إخراج جديد ، تتم مقارنته مع كل نمط بالترتيب المسرد. وبالتالي ، قد تختبر عدم وجود تطابق من خلال جعل النموذج الأخير مضمونًا للظهور ، مثل المطالبة. في الحالات التي لا يوجد فيها مطالبة ، يجب عليك استخدام timeout (مثلما تفعل إذا كنت تتفاعل يدوياً).

يتم تحديد الأنماط بثلاث طرق. بشكل افتراضي ، يتم تحديد الأنماط كما هو الحال مع أمر مطابقة السلسلة Tcl. (تشبه هذه الأنماط أيضًا تعبيرات C-shell العادية التي يشار إليها عادةً بأنماط "glob"). قد يتم استخدام العلامة -gl لحماية الأنماط التي قد تتطابق مع ذلك توقع أن تفعل الأعلام ذلك. يجب حماية أي نمط يبدأ بـ "-" بهذه الطريقة. (جميع السلاسل التي تبدأ بـ "-" محجوزة للخيارات المستقبلية.)

على سبيل المثال ، الجزء التالي يبحث عن تسجيل دخول ناجح. (لاحظ أن الإجهاض يُفترض أنه إجراء محدد في مكان آخر في البرنامج النصي.)

توقع {busy {puts busy \ n؛ exp_continue} فشل في إحباط "كلمة مرور غير صالحة" abort timeout abort connected}

تعتبر الأسعار ضرورية على النمط الرابع حيث أنها تحتوي على مساحة ، والتي قد تفصل النمط عن الإجراء. تتطلب الأنماط التي لها نفس الإجراء (مثل 3 و 4) سرد الإجراءات مرة أخرى. يمكن تجنب ذلك باستخدام أنماط نمط regexp (انظر أدناه). يمكن العثور على مزيد من المعلومات حول تشكيل أنماط نمط glob في دليل Tcl.

تتبع أنماط نمط regexp بناء الجملة المحدد بواسطة الأمر regexp (اختصار لـ "التعبير العادي") في Tcl. يتم تقديم أنماط regexp مع العلم -re . يمكن إعادة كتابة المثال السابق باستخدام regexp على النحو التالي:

توقع {busy {puts busy \ n؛ exp_continue} -re "failed | invalid password" abort timeout abort connected}

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

لاحظ أنه في العديد من برامج التحرير ، يتطابق ^ و $ مع بداية ونهاية الأسطر على التوالي. ومع ذلك ، نظرًا لأن المتوقع ليس موجهًا للخط ، فإن هذه الأحرف تتطابق مع بداية البيانات ونهايتها (في مقابل الخطوط) الموجودة حاليًا في المخزن المؤقت المطابق المتوقع. (أيضًا ، راجع الملاحظة أدناه على "عسر الهضم في النظام".)

يتسبب إشارة -ex في مطابقة النمط كسلسلة "دقيق". يتم إجراء أي تفسير ل * ، ^ ، وما إلى ذلك (على الرغم من أنه لا يزال يتعين مراعاة الاتفاقيات Tcl المعتادة). الأنماط الدقيقة دائمًا غير مثبتة.

تؤدي العلامة -nocase إلى أحرف كبيرة من الإخراج للمقارنة كما لو كانت أحرف صغيرة. النمط لا يتأثر.

أثناء قراءة الإخراج ، يمكن أكثر من 2000 بايت فرض وحدات البايت السابقة "نسيان". قد يتغير هذا مع الدالة match_max . (لاحظ أن القيم الكبيرة بشكل مفرط يمكن أن تبطئ نظير النمط.) إذا كان patlist هو full_buffer ، فسيتم تنفيذ النص المقابل إذا تم استلام البايتات match_max ولم تتطابق أي أنماط أخرى. سواء تم استخدام الكلمة الأساسية full_buffer أم لا ، تتم كتابة الأحرف المنسية إلى expect_out (المخزن المؤقت).

إذا كانت patlist هي الكلمة الأساسية خالية ، وتم السماح بالقيم الخالية (عبر الأمر remove_nulls ) ، فسيتم تنفيذ النص المقابل إذا تم مطابقة ASCII 0 واحد. لا يمكن مطابقة 0 بايت عبر أنماط glob أو regexp.

عند مطابقة نمط (أو eof أو full_buffer) ، يتم حفظ أي مخرجات مطابقة وغير متطابقة من قبل في المتغير المتوقع (المخزن المؤقت) . يتم حفظ ما يصل إلى 9 مطابقات سلسلة regexp في المتغيرات expect_out (1 ، سلسلة) من خلال expect_out (9 ، سلسلة) . إذا تم استخدام علامة -indges قبل نمط ، يتم تخزين مؤشرات البداية والنهاية (في نموذج مناسب لبروتوكول ) من سلاسل 10 في المتغيرات المتوقعة (X ، بداية) و expect_out (X ، النهاية) حيث X هو رقم ، يناظر موقف سلسلة فرعية في المخزن المؤقت. يشير 0 إلى سلاسل مطابقة للنمط بأكمله ويتم تكوينه لأنماط الكرة الأرضية بالإضافة إلى أنماط regexp. على سبيل المثال ، إذا أنتجت عملية إخراج "abcdefgh \ n" ، ناتج:

نتوقع "مؤتمر نزع السلاح"

كما لو أن العبارات التالية قد تم تنفيذها:

set set_out (0، string) cd set expect_out (buffer) abcd

يتم ترك "efgh \ n" في المخزن المؤقت للإخراج. إذا أدت إحدى العمليات إلى إخراج "abbbcabkkkka \ n" ، فإن النتيجة ناتجة عن:

تتوقع - الاستجابات - "ب (ب *). * (ك +)"

كما لو أن العبارات التالية قد تم تنفيذها:

set expect_out (0، start) 1 set expect_out (0، end) 10 set expect_out (0، string) bbbcabkkkk set expect_out (1، start) 2 set expect_out (1، end) 3 set expect_out (1، string) bb set expect_out (2 ، البداية) 10 مجموعة expect_out (2 ، النهاية) 10 مجموعة expect_out (2 ، سلسلة) k set expect_out (buffer) abbbcabkkkk

ويترك "a \ n" في المخزن المؤقت للإخراج. نمط "*" (و - "." *) سوف تدفق المخزن المؤقت الإخراج دون قراءة أي إخراج أكثر من العملية.

عادةً ، يتم تجاهل الإخراج المتطابق من المخازن المؤقتة الداخلية Expect. قد يتم منع هذا عن طريق إدخال نمط مع علامة notnotter . هذا العلم مفيد بشكل خاص في التجريب (ويمكن اختصاره إلى "-not" للراحة أثناء التجريب).

يتم تخزين معرف التزاوج المرتبط بالإخراج المطابق ( أو eof أو full_buffer) في expect_out (spawn_id) .

تؤدي العلامة -timeout الأمر المتوقع الحالي لاستخدام القيمة التالية كـ مهلة بدلاً من استخدام قيمة متغير timeout.

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

على سبيل المثال ، ينتظر المثال التالي "متصل" من العملية الحالية ، أو "مشغول" ، أو "فشل" ، أو "كلمة مرور غير صالحة" من spawn_id المسمى بـ $ proc2.

تتوقع {-i $ proc2 busy {puts busy \ n؛ exp_continue} -re "failed | invalid password" abort timeout abort connected}

يمكن استخدام قيمة المتغير العام any_spawn_id لمطابقة الأنماط مع أي spawn_ids التي تم تسميتها مع كل علامات -i أخرى في الأمر المتوقع الحالي. يتم توفير spawn_id من العلامة -i بدون أي نمط مرتبط (أي يتبع مباشرة من قبل آخر -i ) لأي أنماط أخرى في نفس الأمر المتوقع المرتبط بـ any_spawn_id.

قد يشير علم -i أيضًا إلى متغير عام في هذه الحالة ، تتم قراءة المتغير للحصول على قائمة بمعرفات البيضة. يتم إعادة قراءة المتغير عندما يتغير. يوفر هذا طريقة لتغيير مصدر I / O أثناء تنفيذ الأمر. وتعرف معرّفات تفرخ هذه الطريقة باسم هويات تفرخ "غير مباشرة".

إجراءات مثل كسر واستمرار تسبب هياكل التحكم (أي ل ، proc ) على التصرف بالطريقة المعتادة. يسمح الأمر exp_continue لنفسه بمواصلة التنفيذ بدلاً من العودة كما هو معتاد.

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

نتوقع {Password: {stty -echo send_user "كلمة المرور (لمستخدم $) على $ host:" expect_user -re "(. *) \ n" send_user "\ n" send "$ expect_out (1، string) \ r" stty echo exp_continue} كلمة مرور غير صحيحة {send_user "غير صحيحة أو الحساب \ n" الخروج} مهلة {send_user "اتصال بـ $ host timed out \ n" exit} eof {send_user \ "فشل الاتصال بالمضيف: $ expect_out (buffer)" exit} - إعادة المطالبة $}

على سبيل المثال ، قد يساعد الجزء التالي المستخدم في توجيه تفاعل مؤتمت بالكامل بالفعل. في هذه الحالة ، يتم وضع الجهاز في وضع raw. إذا قام المستخدم بالضغط على "+" ، فسيتم زيادة المتغير. إذا تم الضغط على "p" ، فسيتم إرسال العديد من عمليات الإرجاع إلى العملية ، ربما لتكديسها بطريقة ما ، و "i" يتيح للمستخدم التفاعل مع العملية ، ويسر بشكل فعال السيطرة على البرنامج النصي. في كل حالة ، يتيح exp_continue للمتوقع الحالي متابعة مطابقة النمط بعد تنفيذ الإجراء الحالي.

stty raw -echo expect_after {-i $ user_spawn_id "p" {send "\ r \ r \ r"؛ exp_continue} "+" {incr foo؛ exp_continue} "i" {interact؛ exp_continue} "إنهاء" الخروج

بشكل افتراضي ، يعيد تعيين exp_continue مؤقت الموقت. لا يتم إعادة تشغيل المؤقت ، إذا تم استدعاء exp_continue مع علامة -continue_timer .

expect_after [expect_args]
يعمل بطريقة مماثلة لـ expect_before باستثناء أنه إذا كان من المتوقع أن تتطابق الأنماط من كلا من المتوقع و after_after ، فسيتم استخدام نموذج التوقع . انظر الأمر expect_before لمزيد من المعلومات.

expect_background [expect_args]
يأخذ نفس الحجج كما هو متوقع ، ومع ذلك يعود على الفور. يتم اختبار الأنماط عند وصول مدخلات جديدة. مهلة النمط والتقصير لا معنى لها في expect_background ويتم تجاهلها بصمت. بخلاف ذلك ، يستخدم الأمر expect_background أنماط expect_before و expect_after تمامًا كما هو متوقع .

عندما يتم تقييم إجراءات expect_background ، يتم حظر معالجة الخلفية لنفس معرف البيضة. يتم إلغاء حظر المعالجة الخلفية عند اكتمال الإجراء. بينما يتم حظر معالجة الخلفية ، فمن الممكن أن تتوقع (المقدمة) على نفس معرف تفرخ.

لا يمكن تنفيذ أمر متوقع أثناء إلغاء حظر. يتم حذف expect_background لمعرف تكاثر معين عن طريق التصريح عن new_background جديد بنفس معرف spawn. يؤدي الإعلان عن expect_background بدون أي نمط إلى إزالة معرف التبييض المعطى من القدرة على مطابقة الأنماط في الخلفية.

expect_before [expect_args]
يأخذ نفس الحجج كما هو متوقع ، ومع ذلك يعود على الفور. يتم إضافة ضمنيًا أزواج عمل التصرف من أحدث قبل_العمل مع نفس رقم تعريف البيضة إلى أي أوامر توقع متوقعة . في حالة تطابق نمط ، يتم التعامل معه كما لو تم تحديده في أمر المتوقع نفسه ، ويتم تنفيذ النص المرتبط في سياق الأمر المتوقع . إذا كان من الممكن أن تتطابق الأنماط من كل من expect_before و المتوقع ، فسيتم استخدام النمط expect_before .

إذا لم يتم تحديد أي نمط ، فلن يتم التحقق من هوية البيضة لأي أنماط.

ما لم يتم تجاوزها بواسطة علامة -i ، تتطابق الأنماط expect_before مع معرف التعريف الذي تم تعريفه في الوقت الذي تم فيه تنفيذ الأمر expect_before (وليس عندما يتم مطابقة النمط الخاص به).

تتسبب العلامة --info في توقع عودة المواصفات الحالية للأنماط التي ستطابقها . بشكل افتراضي ، تقوم بالإبلاغ عن معرف التفريغ الحالي. قد يتم إعطاء مواصفات معرف spawn اختياري للحصول على معلومات حول هذا التعريف. فمثلا

expect_before -info -i $ proc

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

بدلاً من مواصفات معرف التفرعات ، سيتسبب العلم "-all" في "-info" للإبلاغ عن كافة معرفات البيضة.

يمكن إعادة استخدام إخراج إشارة -info كـ الوسيطة المتوقعة.

expect_tty [expect_args]
مثل توقع لكنه يقرأ الأحرف من / dev / tty (أي ضغطات المفاتيح من المستخدم). بشكل افتراضي ، يتم تنفيذ القراءة في الوضع المطبوخ. وهكذا ، يجب أن تنتهي الخطوط بعائد لكي تتوقع رؤيتها. يمكن تغيير هذا عن طريق stty (انظر الأمر stty أدناه).

expect_user [expect_args]
هو مثل توقع لكنه يقرأ الأحرف من stdin (أي ضربات المفاتيح من المستخدم). بشكل افتراضي ، يتم تنفيذ القراءة في الوضع المطبوخ. وهكذا ، يجب أن تنتهي الخطوط بعائد لكي تتوقع رؤيتها. يمكن تغيير هذا عن طريق stty (انظر الأمر stty أدناه).

شوكة
يخلق عملية جديدة. العملية الجديدة هي نسخة طبق الأصل من عملية التوقعات الحالية. عند النجاح ، تقوم الدالة fork بإرجاع 0 إلى العملية (التابعة) الجديدة وتقوم بإرجاع معرف العملية الخاص بالطريقة التابعة إلى العملية الأصل. عند الفشل (بسبب عدم توفر الموارد ، على سبيل المثال ، مساحة المبادلة ، الذاكرة) ، يعود الشوكة -1 إلى العملية الرئيسية ، ولا يتم إنشاء أي عملية تابعة.

تخرج العمليات المتشعبة عبر أمر exit ، تمامًا مثل العملية الأصلية. يتم السماح لعمليات Forked الكتابة إلى ملفات السجل. إذا لم تقم بتعطيل التصحيح أو تسجيل الدخول في معظم العمليات ، فقد تكون النتيجة مربكة.

قد يتم الخلط بين بعض تطبيقات pty من قبل العديد من القراء والكتاب ، حتى للحظات. وبالتالي ، فمن الأسلم أن يتم التفرع قبل عمليات التبويض.

التفاعل [string1 body1] ... [stringn [bodyn]]
يعطي السيطرة على العملية الحالية للمستخدم ، بحيث يتم إرسال ضغطات المفاتيح إلى العملية الحالية ، ويتم إرجاع stdout و stderr من العملية الحالية.

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

إذا تطلبت الوسيطات إلى جملة التفاعل بالكامل أكثر من سطر واحد ، فقد يتم "تحجيم" جميع الوسيطات في واحدة لتجنب إنهاء كل سطر بخط مائل عكسي. في هذه الحالة ، ستحدث بدائل Tcl المعتادة على الرغم من الأقواس.

على سبيل المثال ، يعمل الأمر التالي على التفاعل مع أزواج السلسلة - الجسم التالية المحددة: عند الضغط على ^ Z ، يتم تعليق Expect . (تقوم العلامة -reert باستعادة أوضاع المطراف.) عند الضغط على ^ A ، يرى المستخدم "أنك قمت بكتابة عنصر تحكم -A" ويتم إرسال العملية إلى ^ A. عندما يتم الضغط على $ ، يرى المستخدم التاريخ. عندما يتم الضغط على ^ C ، يخرج Expect . إذا تم إدخال "foo" ، فسيرى المستخدم "bar". عند الضغط على ~~ ، يتم تشغيل مترجم Expect بشكل تفاعلي.

set CTRLZ \ 032 interact {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "you typed a control-A \ n"؛ أرسل "\ 001"} $ {send_user "التاريخ هو [تنسيق الساعة [clock seconds]]."} \ 003 exit foo {send_user "bar"} ~~}

في أزواج السلسلة - الجسم ، تتم مطابقة السلاسل بالترتيب الذي تم سردها كوسيطة. لا يتم إرسال السلاسل التي تتطابق جزئيًا مع العملية الحالية تحسبًا للباقي القادم. إذا تم إدخال الأحرف بحيث لا يمكن أن يكون هناك تطابق ، فسيتم إرسال جزء السلسلة فقط إلى العملية التي لا يمكن أن تبدأ بمطابقة أخرى. وبالتالي ، يمكن أن تتطابق السلاسل التي تكون سلاسل فرعية للمطابقات الجزئية لاحقًا ، إذا فشلت السلاسل الأصلية التي كانت تحاول مطابقتها في النهاية.

بشكل افتراضي ، مطابقة السلسلة تمامًا مع عدم وجود بطاقات wild . (في المقابل ، يستخدم أمر التوقع أنماط نمط glob بشكل افتراضي.) يمكن استخدام العلامة -ex لحماية الأنماط التي قد تتطابق مع ذلك التفاعل بين العلامات من القيام بذلك. يجب حماية أي نمط يبدأ بـ "-" بهذه الطريقة. (جميع السلاسل التي تبدأ بـ "-" محجوزة للخيارات المستقبلية.)

تفرض العلامة -re السلسلة المراد تفسيرها كنمط نمط regexp. في هذه الحالة ، يتم تخزين السطوح المطابقة في المتغير interact_out بطريقة مماثلة للطريقة التي يتوقع بها إخراج المخرجات في المتغير المتوقع . علم -indices معتمد بشكل مماثل.

يقدم النمط eof إجراءًا يتم تنفيذه عند نهاية الملف. قد يتبع نمط eof منفصل أيضًا علامة -output في هذه الحالة يتم مطابقتها إذا تم الكشف عن eof أثناء كتابة المخرجات. إجراء eof الافتراضي هو "return" ، بحيث يتفاعل التفاعل ببساطة مع أي EOF.

تقدم مهلة النمط المهلة (بالثواني) والإجراء الذي يتم تنفيذه بعد قراءة أي أحرف لوقت معين. ينطبق نمط المهلة على العملية المحددة مؤخرًا. لا يوجد مهلة افتراضية. لا يؤثر المتغير الخاص "timeout" (المستخدم من قبل الأمر المتوقع ) على هذا الوقت.

على سبيل المثال ، يمكن استخدام العبارة التالية في autologout المستخدمين الذين لم يكتبوا أي شيء لمدة ساعة ولكنهم لا يزالون يتلقون رسائل النظام المتكررة:

interact -input $ user_spawn_id timeout 3600 return -output \ $ spawn_id

إذا كان النمط هو الكلمة الأساسية خالية ، وتم السماح بالقيم الخالية (عبر الأمر remove_nulls ) ، فسيتم تنفيذ النص المقابل إذا تم مطابقة ASCII 0 واحد. لا يمكن مطابقة 0 بايت عبر أنماط glob أو regexp.

يؤدي تعيين نمط مع كتابة -Iwrite إلى تعيين المتغير interact_out (spawn_id) المتغير إلى spawn_id الذي يطابق النمط (أو eof).

إجراءات مثل كسر واستمرار تسبب هياكل التحكم (أي ل ، proc ) على التصرف بالطريقة المعتادة. على أي حال ، تعود أسباب العودة إلى التفاعل مع المتصل ، في حين تتسبب inter_return في التسبب في حدوث عودة في المتصل. على سبيل المثال ، إذا كان "proc foo" يُعرف بالتفاعل ، ثم قام بتنفيذ الإجراء inter_return ، فسيعود الأمر proc foo . (وهذا يعني أنه إذا كان مترجم المكالمات التفاعلية سيؤدي إرجاع الكتابة بشكل تفاعلي إلى استمرار التفاعل ، بينما يتسبب inter_eturn في عودة التفاعل إلى المتصل الخاص به.)

أثناء التفاعل ، يتم استخدام الوضع raw بحيث يتم تمرير كافة الأحرف إلى العملية الحالية. إذا لم تستطع العملية الحالية التقاط إشارات التحكم في الوظيفة ، فستتوقف إذا أرسلت إشارة توقف (بشكل افتراضي ^ Z). لإعادة تشغيله ، أرسل إشارة متابعة (مثل "kill -CONT"). إذا كنت تريد بالفعل إرسال SIGSTOP إلى مثل هذه العملية (بواسطة ^ Z) ، فضع في اعتبارك وضع csh أولاً ثم قم بتشغيل البرنامج. من ناحية أخرى ، إذا كنت تريد إرسال SIGSTOP لتوقع نفسه ، فقم أولاً باستدعاء مترجم (ربما باستخدام حرف هروب) ، ثم اضغط على ^ Z.

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

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

تقوم العلامة -echo بإرسال أحرف تتطابق مع النمط التالي مرة أخرى إلى العملية التي تم إنشاؤها عند قراءة كل حرف. قد يكون هذا مفيدًا عندما يحتاج المستخدم إلى رؤية تعليقات من أنماط مكتوبة جزئيًا.

إذا كان هناك صدى لصدى ، لكن أخفق في النهاية في المطابقة ، يتم إرسال الحروف إلى العملية الناتجة. إذا كانت عملية التفريخ ترددها ، فسيرى المستخدم الأحرف مرتين. -ربما يكون مناسبًا فقط في الحالات التي يكون فيها المستخدم غير قادر على إكمال النمط. على سبيل المثال ، يكون المقتطف التالي من rftp ، البرنامج النصي العودي- ftp ، حيث تتم مطالبة المستخدم بإدخال ~ g ، أو p ، أو ~ l ، للحصول على ، أو وضع ، أو إدراج الدليل الحالي بشكل متكرر. هذه بعيدة جدا عن أوامر ftp العادية ، التي من المستبعد أن يكتب المستخدم ~ متبوعا بأي شيء آخر ، ما عدا عن طريق الخطأ ، وفي هذه الحالة ، من المحتمل أن يتجاهل النتيجة على أية حال.

التفاعلات {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

يرسل إشارة -nobuffer الأحرف التي تطابق النمط التالي إلى عملية الإخراج كما يتم قراءة الأحرف.

يكون هذا مفيدًا عندما ترغب في السماح لبرنامج ما بالرد على هذا النمط. على سبيل المثال ، قد يتم استخدام ما يلي لمراقبة أي شخص يقوم بالاتصال (مودم على نمط Hayes). في كل مرة يظهر فيها "atd" يقوم البرنامج النصي بتسجيل بقية السطر.

proc lognumber {} {interact -nobuffer -re "(. *) \ r" return puts $ log "[clock format [clock seconds]]: dialed $ interact_out (1، string)"} interact -nobuffer "atd" lognumber

أثناء التفاعل ، يتم تجاهل الاستخدام السابق لـ log_user . على وجه الخصوص ، التفاعل سوف يفرض تسجيله (يتم إرساله إلى المخرج القياسي) حيث يفترض أن المستخدم لا يرغب في التفاعل بطريقة عمياء.

تؤدي العلامة -o إلى تطبيق أي زوج من الأزرار التالية على إخراج العملية الحالية. قد يكون ذلك مفيدًا ، على سبيل المثال ، عند التعامل مع المضيفين الذين يرسلون أحرفًا غير مرغوب فيها أثناء جلسة telnet.

بشكل افتراضي ، يتوقع التفاعل أن يقوم المستخدم بكتابة stdin وقراءة stdout لعملية Expect نفسها. تؤدي العلامة -U (الخاصة بـ "المستخدم") إلى التفاعل مع المستخدم كعملية مسماة بواسطة الوسيطة الخاصة به (والتي يجب أن تكون معرّفًا spawned).

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

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

spawn login set login $ spawn_id spawn tip modem # dial out out to user # connect user to login interact -u $ login

لإرسال مخرجات إلى عمليات متعددة ، قم بسرد كل قائمة معروضة لبيضة تسبقها علامة -output . قد يتم تحديد المدخلات لمجموعة من معرفات تفرخ الناتج من خلال قائمة معرّضات تفرخ مسبقة بعلامة -input . (قد يأخذ كل من الإدخال والإخراج قوائم بنفس شكل علامة -i في الأمر المتوقع ، باستثناء أن any_spawn_id ليس له معنى في التفاعل .) تنطبق جميع الأعلام والسلاسل (أو الأنماط) التالية على هذا الإدخال إلى آخر. يظهر إشارة المدخلات. في حالة عدم ظهور أي إدخال ، يشير -output إلى "-input $ user_spawn_id -output". (وبالمثل ، مع الأنماط التي لا تحتوي على الإدخال .) إذا تم تحديد إحداها ، فإنها تتجاوز $ user_spawn_id. إذا تم تحديد الإدخال الثاني ، فإنه يتجاوز $ spawn_id. قد يتم تحديد علامات الإدخال الإضافية.

عمليات الإدخال الضمني جهازي الافتراضية إلى تحديد النواتج الخاصة بهم spawn_id $ و $ user_spawn_id (بالعكس). في حالة ظهور علامة " إدخال" بدون إشارة علمية ، يتم تجاهل الأحرف من هذه العملية .

يقدم العلم -i بديلا عن spawn_id الحالي عند عدم استخدام أي من علامات الإنتاج أو الإخراج الأخرى. تشير العلامة A -i إلى علم -o.

من الممكن تغيير العمليات التي يتم التفاعل معها باستخدام معرفات تفرخ غير مباشرة. (يتم وصف معرفات البيضة غير المباشرة في القسم الموجود على أمر التوقع.) قد يتم تحديد معرفات البيضة غير المباشرة بأعلام -i أو -u أو -input أو -output.

مترجم [args]
يتسبب في أن تتم مطالبة المستخدم بشكل تفاعلي لأوامر Expect و Tcl. يتم طباعة نتيجة كل أمر.

إجراءات مثل كسر واستمرار تسبب هياكل التحكم (أي ل ، proc ) على التصرف بالطريقة المعتادة. ومع ذلك ، تؤدي العودة إلى عودة المترجم إلى المتصل ، في حين يؤدي inter_ريتن إلى أن يتسبب المترجم في حدوث عائد في المتصل. على سبيل المثال ، إذا كان "proc foo" يدعى مترجمًا ، ثم قام بتنفيذ الإجراء inter_return ، فسوف يعود الأمر proc foo . أي أمر آخر يؤدي مترجم لمواصلة المطالبة بأوامر جديدة.

بشكل افتراضي ، يحتوي الموجه على عددين. يصف العدد الصحيح الأول عمق رصة التقييم (أي عدد المرات التي تم فيها استدعاء Tcl_Eval). العدد الصحيح الثاني هو معرف محفوظات Tcl. يمكن تعيين المطالبة بتحديد إجراء يسمى "prompt1" تصبح قيمته المرتجعة هي الموجه التالي. إذا كانت العبارة تحتوي على علامات اقتباس مفتوحة ، أو أقواس ، أو أقواس ، أو أقواس ، فسيتم إصدار موجه ثانوي (افتراضيًا "+>") عند السطر الجديد. قد يتم تعيين المطالبة الثانوية عن طريق تحديد إجراء يسمى "prompt2".

أثناء استخدام المترجم ، يتم استخدام الوضع المطبوخ ، حتى إذا كان المتصل به يستخدم وضع raw.

إذا تم إغلاق stdin ، فسيرجع المترجم ما لم يتم استخدام العلم ، وفي هذه الحالة يتم استدعاء الوسيطة التالية.

log_file [args] [[-a] file]
إذا تم توفير اسم ملف ، فسوف يسجل log_file نسخة من الجلسة (بداية عند هذه النقطة) في الملف. سوف log_file إيقاف التسجيل إذا تم إعطاء أي وسيطة. أي ملف سجل سابق مغلق.

بدلاً من اسم ملف ، قد يتم توفير معرف ملف Tcl باستخدام علامات - مفتوح أو - leaveopen . يشبه هذا الأمر spawn . (راجع تفرخ لمزيد من المعلومات.)

إخراج - إشارة العلم يتم تسجيله تم منعه بواسطة الأمر log_user .

بشكل افتراضي ، يتم إلحاق الأمر log_file بالملفات القديمة بدلاً من اقتطاعها ، وذلك لملاءمة القدرة على إيقاف تشغيل التسجيل وعلى عدة مرات في جلسة واحدة. لاقتطاع الملفات ، استخدم العلامة -noappend .

تؤدي العلامة -info إلى log_file لإرجاع وصف لحدوث آخر معطيات غير المعلومات المقدمة.

log_user -info | 0 | 1
بشكل افتراضي ، يتم تسجيل الحوار send / expect إلى stdout (و logfile إذا كان مفتوحاً). يتم تعطيل التسجيل إلى stdout بواسطة الأمر "log_user 0" وإعادة تمكينه بواسطة "log_user 1". لم يتغير تسجيل الدخول إلى ملف السجل.

تؤدي العلامة -info إلى أن يقوم log_user بإرجاع وصف لواجهة non-info الأخيرة.

match_max [-d] [-i spawn_id] [الحجم]
يعرّف حجم المخزن المؤقت (بالبايت) المستخدم داخلياً عن طريق توقع . بدون وسيطة بحجم ، يتم إرجاع الحجم الحالي.

مع العلم -d ، يتم تعيين الحجم الافتراضي. (الافتراضي الافتراضي هو 2000). باستخدام العلامة - i ، يتم تعيين الحجم لمعرف تفرخ مسمى ، وإلا يتم تعيينه للعملية الحالية.

تراكب [- # spawn_id] [- # spawn_id] [...] برنامج [args]
تنفيذ برنامج " args" بدلاً من برنامج Expect الحالي ، الذي ينتهي. تفرض واصلة الحافة الواصلة واصلة أمام اسم الأمر كما لو كانت قذيفة تسجيل دخول. يتم إغلاق جميع spawn_ids باستثناء تلك المسماة كوسيطة. يتم تعيين هذه إلى معرفات ملف مسمى.

يتم تعيين Spawn_ids لمعرفات الملف للبرنامج الجديد في الوراثة. على سبيل المثال ، يقوم السطر التالي بتشغيل الشطرنج ويسمح بالتحكم في العملية الحالية - على سبيل المثال ، لعبة الشطرنج الرئيسية.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id chess

هذا هو أكثر كفاءة من "التفاعل -U" ، ومع ذلك ، فإنه يضحي القدرة على القيام بالتفاعل المبرمج لأن عملية Expect لم تعد مسيطرة.

لاحظ أنه لا يتم توفير أي جهاز تحكم. وبالتالي ، إذا قمت بفصل أو إعادة إعداد المدخلات القياسية ، فإن البرامج التي تقوم بالتحكم في الوظيفة (الأصداف ، تسجيل الدخول ، إلخ) لن تعمل بشكل صحيح.

تعادل [-d] [-i spawn_id] [value]
يحدد ما إذا كان يجب الحفاظ على التكافؤ أو تجريده من مخرجات العمليات المتولدة. إذا كانت القيمة صفرًا ، يتم تجريد التماثل ، وإلا لن يتم تجريدها. بدون وسيطة قيمة ، يتم إرجاع القيمة الحالية.

باستخدام علامة -d ، يتم تعيين قيمة التكافؤ الافتراضية. (الافتراضي الأول هو 1 ، بمعنى ، التماثل غير مجزأة.) باستخدام العلامة -i ، يتم تعيين قيمة التماثل لمعرف تفرخ مسمى ، وإلا يتم تعيينه للعملية الحالية.

remove_nulls [-d] [-i spawn_id] [value]
يحدد ما إذا كان يتم الاحتفاظ بالقيم الخالية أو إزالتها من مخرجات العمليات الناتجة قبل مطابقة أو تخزين النمط في المتغير المتوقع أو بالتفاعل . إذا كانت القيمة 1 ، تتم إزالة القيم الخالية. إذا كانت القيمة 0 ، لا يتم إزالة القيم الخالية. بدون وسيطة قيمة ، يتم إرجاع القيمة الحالية.

مع العلم -d ، يتم تعيين القيمة الافتراضية. (الافتراضي الأول هو 1 ، أي يتم إزالة الأصفار.) مع علامة - i ، يتم تعيين القيمة لمعرف تفرخ مسمى ، وإلا يتم تعيينها للعملية الحالية.

سواء تم إزالة بالقيم الفارغة أم لا ، سوف توقع تسجيل بايت خالية إلى السجل و stdout.

إرسال سلسلة [-flags]
يرسل سلسلة إلى العملية الحالية. على سبيل المثال ، الأمر

أرسل "hello world \ r"

يرسل الشخصيات ، helloworld إلى العملية الحالية. (يتضمن Tcl أمر printf -like (يسمى format ) والذي يمكنه بناء سلاسل معقدة بشكل تعسفي.)

يتم إرسال الأحرف على الفور بالرغم من أن البرامج التي تحتوي على مدخلات مخزنة بالخطوط لن تقوم بقراءة الأحرف حتى يتم إرسال حرف إرجاع. يتم إرجاع حرف الإرجاع "\ r".

يفرض - flag أن يتم تفسير الوسيطة التالية على أنها سلسلة وليس علامة. يمكن أن يسبق أي سلسلة "-" ما إذا كانت تبدو بالفعل كعلامة أم لا. هذا يوفر آلية موثوقة لتحديد سلاسل متغيرة دون أن تعثر من قبل تلك التي تبدو عن طريق الخطأ مثل الأعلام. (جميع السلاسل التي تبدأ بـ "-" محجوزة للخيارات المستقبلية.)

تعلن العلامة -i أن يتم إرسال السلسلة إلى spawn_id المسماة. إذا كان spawn_id هو user_spawn_id ، وكانت الوحدة الطرفية في وضع raw ، يتم ترجمة خطوط جديدة في السلسلة إلى تسلسلات new- line بحيث تظهر كما لو كانت المحطة الطرفية في وضع مطهي. يعطل العلم -raw هذه الترجمة.

يرسل العلامة -null أحرف فارغة (0 بايت). بشكل افتراضي ، يتم إرسال قيمة خالية. قد يتبع عدد صحيح -null للإشارة إلى عدد nulls لإرسال.

العلم يولد كسر شرط. هذا أمر منطقي فقط إذا كان معرف التزاوج يشير إلى جهاز tty تم فتحه عبر "spawn-open". إذا كنت قد أفرزت عملية مثل نصيحة ، يجب عليك استخدام اتفاقية الطرف لتوليد فترة راحة.

يتم إرسال إخراج إشارة العلم -s "ببطء" ، وبالتالي تجنب الوضع الشائع حيث يحدد الكمبيوتر المخزن المؤقت الذي تم تصميمه للإنسان الذي لا يمكنه أبدًا تخزين نفس المخزن المؤقت . يتم التحكم في هذا الإخراج بقيمة المتغير "send_slow" الذي يأخذ قائمة عنصرين. العنصر الأول هو عدد صحيح يصف عدد وحدات البايت لإرسالها بشكل شاذ. العنصر الثاني هو رقم حقيقي يصف عدد الثواني التي يجب بواسطتها فصل عمليات الإرسال الذرية. على سبيل المثال ، "set send_slow {10 .001}" قد تفرض "send -s" لإرسال سلاسل بـ 1 مللي ثانية بين كل 10 أحرف مرسلة.

- يتم إرسال إخراج قوات العلم - (إلى حد ما) مثل الإنسان في الواقع الكتابة. تظهر التأخيرات الشبيهة بالإنسان بين الشخصيات. (تستند الخوارزمية إلى توزيع Weibull ، مع تعديلات لتلائم هذا التطبيق المعين.) يتم التحكم في هذا الناتج بقيمة المتغير "send_human" الذي يأخذ قائمة خمسة عناصر. العنصران الأولان هما متوسط ​​زمن الخطأ بين الأحرف في ثوانٍ. يتم استخدام الأول بشكل افتراضي. يستخدم الثاني في نهايات الكلمات ، لمحاكاة الوقف البسيط الذي يحدث في بعض الأحيان في مثل هذه التحولات. المعامل الثالث هو قياس التباين حيث .1 متغير تمامًا ، 1 متغير بشكل معقول ، و 10 متغير تمامًا. النقاط القصوى هي 0 إلى ما لا نهاية. المعلمتان الأخيرتان هما ، على التوالي ، الحد الأدنى والأقصى من الوقت بين المجالات. يتم استخدام الحد الأدنى والحد الأقصى الأخير و "قصاصة" في الوقت النهائي. يمكن أن يكون المتوسط ​​النهائي مختلفًا تمامًا عن المتوسط ​​المحدد إذا كانت القيم الدنيا والقصوى كافية.

على سبيل المثال ، يحاكي الأمر التالي جهاز طباعة سريع ومتسق:

set send_human {.1 .3 1 .05 2} send -h "أنا جائع. لنقم بالغداء."

في حين أن ما يلي قد يكون أكثر ملاءمة بعد الخميرة:

set send_human {.4 .4 .2 .55 100} send -h "Goodd party lash night!"

لاحظ أنه لا يتم محاكاة الأخطاء ، على الرغم من أنه يمكنك إعداد حالات تصحيح الخطأ بنفسك عن طريق تضمين الأخطاء والتصحيحات في وسيطة الإرسال.

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

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

# لتجنب إعطاء المتسللين تلميحات حول كيفية اختراقه ، لا يطالب هذا النظام بكلمة مرور خارجية. # انتظر لمدة 5 ثوان ل exec لإكمال تفرخ telnet very.secure.gov sleep 5 send password \ r

exp_send هو اسم مستعار للإرسال. إذا كنت تستخدم Expectk أو بعض المتغيرات الأخرى في بيئة Tk ، يتم تعريف الإرسال بواسطة Tk لغرض مختلف تمامًا. يتم توفير exp_send للتوافق بين البيئات. يتم توفير الأسماء المستعارة مشابهة لأوامر الإرسال الأخرى "توقع" الأخرى.

send_error [-flags] سلسلة
يشبه إرسال ، إلا أنه يتم إرسال الإخراج إلى stderr بدلاً من العملية الحالية.

send_log [-] سلسلة
مثل إرسال ، فيما عدا أنه يتم إرسال السلسلة فقط إلى ملف السجل (راجع log_file .) يتم تجاهل الوسائط إذا لم يكن هناك ملف سجل مفتوح.

سلسلة send_tty [-flags]
يشبه إرسال ، إلا أنه يتم إرسال الإخراج إلى / dev / tty بدلاً من العملية الحالية.

سلسلة send_user [-flags]
يشبه إرسال ، إلا أنه يتم إرسال الإخراج إلى stdout بدلاً من العملية الحالية.

ثواني النوم
يؤدي البرنامج النصي للنوم لعدد معين من الثواني. قد يكون الثواني رقمًا عشريًا. تتم معالجة المقاطعات (وأحداث Tk إذا كنت تستخدم Expectk) أثناء Expect sleeps.

spawn [args] program [args]
يخلق عملية جديدة تعمل "برنامج الارجنتين". ترتبط stdin و stdout stderr و توقع ، بحيث يمكن قراءتها وكتابتها بأوامر " توقع" أخرى. يتم قطع الاتصال عن طريق إغلاق أو إذا كانت العملية نفسها تغلق أي من معرفات الملف.

عند بدء تشغيل عملية بواسطة spawn ، يتم تعيين spawn_id المتغير إلى واصف يشير إلى هذه العملية . تعتبر العملية الموضحة بواسطة spawn_id " العملية الحالية ". يمكن قراءة أو كتابة spawn_id ، في الواقع توفير السيطرة على الوظيفة.

user_spawn_id هو متغير شامل يحتوي على واصف يشير إلى المستخدم. على سبيل المثال ، عند تعيين spawn_id على هذه القيمة ، تتوقع أن تتصرف مثل expect_user .

.I error_spawn_id هو متغير شامل يحتوي على واصف يشير إلى الخطأ القياسي. على سبيل المثال ، عندما يتم تعيين spawn_id على هذه القيمة ، يرسل تصرف مثل send_error .

tty_spawn_id هو متغير عالمي يحتوي على واصف يشير إلى / dev / tty. إذا كان / dev / tty غير موجود (مثل في cron أو at أو batch script) ، فلن يتم تعريف tty_spawn_id . قد يتم اختبار ذلك على النحو التالي:

إذا كان {[info vars tty_spawn_id]} {# / dev / tty موجود} آخر {# / dev / tty غير موجود # ربما في cron أو batch أو at script}

spawn إرجاع معرف عملية UNIX. إذا لم يتم إنتاج أية عملية ، فسيتم إرجاع 0. يتم تعيين spawn_out المتغير (slave، name) إلى اسم جهاز slave.

بشكل افتراضي ، spawn echoes اسم الأمر ووسائطه. يتوقف علم - noecho تفرخ من القيام بذلك.

تؤدي العلامة -console إلى إعادة توجيه إخراج وحدة التحكم إلى عملية spawned. هذا غير معتمد على جميع الأنظمة.

داخليًا ، يستخدم البيضة pty ، ويتم تهيئته بنفس الطريقة التي يستخلص بها المستخدم tty. هذا هو مزيد من التهيئة بحيث تكون جميع الإعدادات "عاقل" (وفقا stty (1)). إذا تم تعريف stty_init المتغير ، فسيتم تفسيره في نمط الوسيطات stty كتكوين إضافي. على سبيل المثال ، سيتسبب "set stin_init raw" في بدء تشغيل المزيد من المطاريف الناتجة عن العمليات في وضع raw. - يتخطى notnotpopy التهيئة على أساس tty المستخدم. -nottyinit يتخطى التهيئة "عاقل".

عادة ، لا يستغرق تفرخ الوقت الكافي للتنفيذ. إذا لاحظت تفرخ أخذ كمية كبيرة من الوقت ، فمن المحتمل أن تواجه ptys التي يتم إسفين. يتم إجراء عدد من الاختبارات على ptys لتجنب التشابك مع العمليات الضالة. (يستغرق ذلك 10 ثوانٍ لكل حرف مربوط مدبب). سيظهر "تشغيل Expect" مع الخيار -d إذا كان Expect يواجه العديد من pty في الحالات الفردية. إذا كنت لا تستطيع قتل العمليات التي يتم إرفاقها بهذه القضايا ، قد يكون اللجوء الوحيد لإعادة التشغيل.

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

تؤدي العلامة -open إلى تفسير الوسيطة التالية على أنها مُعرّف ملف Tcl (على سبيل المثال ، يتم إرجاعها من خلال فتح .) يمكن استخدام معرف التزوير بعد ذلك كما لو كانت عملية تفرخ. (لم يعد يجب استخدام معرف الملف.) يتيح لك ذلك معالجة الأجهزة الأولية والملفات وخطوط الأنابيب كعمليات تفرخ دون استخدام pty. 0 يتم إرجاع للإشارة إلى عدم وجود عملية مقترنة. عندما يتم إغلاق اتصال العملية الناتجة ، يكون معرف ملف Tcl كذلك. يشبه علامة -leaveopen -en- باستثناء عدا ذلك -leaveopen أن يتم ترك معرف الملف مفتوحًا حتى بعد إغلاق معرف التفرعات .

تؤدي العلامة الفارغة إلى فتح pty ولكن لم يتم إنتاج أية عملية . 0 يتم إرجاع للإشارة إلى عدم وجود عملية مقترنة. تم تعيين Spawn_id كالمعتاد.

يتم تعيين spawn_out المتغير (slave، fd) إلى معرف ملف يتوافق مع الراتب pty. يمكن إغلاقه باستخدام "إغلاق-إغلاق".

يقوم علام -Store بتحديد اشارة يتم تجاهلها في العملية الناتجة. بخلاف ذلك ، تحصل الإشارات على السلوك الافتراضي. يتم تسمية الإشارات كما في أمر الملائمة ، إلا أن كل إشارة تتطلب علامة منفصلة.

مستوى ترس
يؤدي إلى طباعة العبارات التالية قبل تنفيذها. يشير (متغيرات تتبع أوامر Tcl's T التتبع.) إلى مدى البعد في مكدس الاستدعاءات للتتبع. على سبيل المثال ، يشغل الأمر التالي Expect أثناء تتبع مستويات الأربعة الأولى من المكالمات ، ولكن لا شيء أسفل ذلك.

نتوقع -c "strace 4" script.exp

تؤدي العلامة --info إلى استرجاع عودة إلى وصف أحدث الحجج غير المعلومات المقدمة.

stty args
يغير أوضاع المطراف بشكل مشابه لأمر stty الخارجي.

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

على سبيل المثال ، وضعت الوسيطات الخام أو -كوكيد الطرفية في وضع الخام. وضعت الحجج -الرأي أو المطبوخة الطرفية في وضع مطبوخ. الحجج صدى و -إعادة وضع المحطة في صدى ونوتة على التوالي.

يوضح المثال التالي كيفية تعطيل echoing بشكل مؤقت. يمكن استخدام هذا في البرامج النصية غير التلقائية لتجنب تضمين كلمات المرور فيها. (انظر مزيدًا من المناقشة حول هذا الموضوع ضمن "تلميحات EXPECT" أدناه.)

stty -echo send_user "Password:" expect_user -re "(. *) \ n" set password $ expect_out (1، string) stty echo

نظام الارجح
يعطي args إلى sh (1) كمدخل ، تماماً كما لو تم كتابته كإمر من طرف. نتوقع الانتظار حتى تنتهي قذيفة. تتم معالجة حالة الإرجاع من sh بالطريقة نفسها التي تعالج exec حالة الإرجاع الخاصة بها.

على النقيض من exec الذي يعيد توجيه stdin و stdout إلى البرنامج النصي ، لا يقوم النظام بإعادة التوجيه (بخلاف ما تشير إليه السلسلة نفسها). وبالتالي ، من الممكن استخدام البرامج التي يجب أن تتحدث مباشرة إلى / dev / tty. للسبب نفسه ، لا يتم تسجيل نتائج النظام في السجل.

timestamp [args]
يعيد الطابع الزمني. بدون أي وسيطات ، يتم إرجاع عدد الثواني منذ تاريخ الحقبة.

يقوم علم -format بإدخال سلسلة يتم إرجاعها ولكن مع عمليات استبدال يتم إجراؤها وفقًا لقواعد POSIX لـ strftime. على سبيل المثال ، يتم استبدال٪ a باسم يومي مختصر (أي ، Sat). البعض الآخر:

٪ a اسم يوم من الأسبوع مختصر٪ اسم أسبوعي كامل٪ b اسم شهر مختصر اسم٪ B شهر كامل٪ c date-time كما في: Wed Oct 6 11:45:56 1993٪ d يوم من الشهر (01-31٪ H ساعة (00-23)٪ I ساعة (01-12)٪ j يوم (001-366)٪ m شهر (01-12)٪ M دقيقة (00-59)٪ p am أو pm٪ S ثانية (00-61) ٪ u يوم (1-7 ، يوم الاثنين هو اليوم الأول من الأسبوع)٪ U أسبوع (00-53 ، أول يوم هو أول يوم من الأسبوع)٪ V أسبوع (01-53 ، نمط ISO 8601)٪ w يوم (0- 6)٪ W أسبوع (00-53 ، أول يوم أول هو أول يوم من الأسبوع)٪ x date-time as in: Wed Oct 6 1993٪ X time as in: 23:59:59٪ y year (00-99) ٪ Y سنة كما في: 1993٪ Z timezone (أو لا شيء لا يمكن تحديده) ٪٪ لعلامة النسبة المئوية

مواصفات٪ أخرى غير محددة. سيتم تمرير أحرف أخرى من خلال يمسها. يتم دعم لغة C فقط.

يرفع العلم الثاني عددًا من الثواني منذ أن يتم استخدام الحقبة كمصدر لتنسيقه . خلاف ذلك ، يتم استخدام الوقت الحالي.

تفرض علامة -gmt إخراج طابع زمني لاستخدام المنطقة الزمنية GMT . بدون علم ، يتم استخدام المنطقة الزمنية المحلية.

فخ [[القيادة] إشارات]
يتسبب في تنفيذ الأمر المعطى عند استلام أي من الإشارات المعطاة في المستقبل. يتم تنفيذ الأمر في النطاق العالمي. في حالة غياب الأمر ، يتم إرجاع إجراء الإشارة. إذا كان الأمر هو السلسلة SIG_IGN ، فسيتم تجاهل الإشارات. إذا كان الأمر هو السلسلة SIG_DFL ، فإن الإشارات تنتج عن النظام الافتراضي. الإشارات هي إما إشارة واحدة أو قائمة إشارات. يمكن تحديد الإشارات رقميًا أو رمزيًا حسب الإشارة (3). قد يتم حذف البادئة "SIG".

مع عدم وجود وسائط (أو الوسيطة -number) ، تقوم الدالة trap بإرجاع رقم الإشارة الخاص بأمر الملاءمة الذي يتم تنفيذه حاليًا.

تستخدم العلامة -code رمز الإرجاع للأمر بدلاً من الكود الذي كان Tcl على وشك إرجاعه عندما بدأ الأمر في الأصل بالعمل.

تتسبب علامة -interp في تقييم الأمر باستخدام المترجم النشط في الوقت الذي يبدأ فيه الأمر في العمل بدلاً من الإعلان عن الملاءمة.

تؤدي العلامة -name إلى إرجاع الأمر trap إلى اسم الإشارة الخاص بأمر الملاءمة الذي يتم تنفيذه حاليًا.

تؤدي علامة -max إلى قيام الأمر trap بإرجاع أكبر رقم إشارة يمكن تعيينه.

على سبيل المثال ، الأمر "فخ {send_user" Ouch! "SIGINT" سيطبع "Ouch!" في كل مرة يضغط فيها المستخدم على ^ C.

بشكل افتراضي ، SIGINT (والذي عادةً ما يتم إنشاؤه عن طريق الضغط على ^ C) و SIGTERM يؤدي إلى توقع إنهاء. هذا بسبب الاعتراض التالي ، الذي تم إنشاؤه افتراضيًا عند بدء Expect.

فخ الخروج {SIGINT SIGTERM}

إذا استخدمت العلامة -D لبدء تشغيل مصحح الأخطاء ، يتم إعادة تعريف SIGINT لبدء تشغيل مصحح الأخطاء التفاعلية. هذا بسبب المصيدة التالية:

فخ {exp_debug 1} SIGINT

يمكن تغيير مصيدة مصحح الأخطاء عن طريق تعيين متغير البيئة EXPECT_DEBUG_INIT إلى أمر اعتراض جديد.

يمكنك ، بالطبع ، تجاوز كلا هذين فقط عن طريق إضافة أوامر ملائمة إلى البرنامج النصي الخاص بك. على وجه الخصوص ، إذا كان لديك "SackINT exit trap" الخاص ، فسيؤدي ذلك إلى تجاوز مصيدة المصحح. هذا مفيد إذا كنت تريد منع المستخدمين من الوصول إلى مصحح الأخطاء على الإطلاق.

إذا كنت تريد تعريف trap الخاص بك على SIGINT ولكن لا يزال اعتراض إلى مصحح الأخطاء عند تشغيله ، استخدم:

if {! [exp_debug]} {trap mystuff SIGINT}

بدلاً من ذلك ، يمكنك تعويضك إلى مصحح الأخطاء باستخدام بعض الإشارات الأخرى.

لن تسمح لك الفخ بإبطال الإجراء الخاص بـ SIGALRM حيث يتم استخدام ذلك داخليًا للتوقع . يعين أمر قطع الاتصال SIGALRM إلى SIG_IGN (تجاهل). يمكنك إعادة تمكين هذا طالما قمت بتعطيله أثناء أوامر spawn اللاحقة.

انظر إشارة (3) لمزيد من المعلومات.

انتظر [أرجس]
التأخير حتى يتم إنهاء عملية التفريخ (أو العملية الحالية إذا لم يتم تسمية أي منها).

انتظر عادة إرجاع قائمة بأربعة أعداد صحيحة. العدد الصحيح الأول هو pid للعملية التي تم انتظارها. العدد الصحيح الثاني هو معرف spawn المقابلة. العدد الصحيح الثالث هو -1 إذا حدث خطأ في نظام التشغيل أو 0 خلاف ذلك. إذا كان العدد الثالث صحيحًا ، فسيكون العدد الرابع هو الحالة التي يتم إرجاعها من خلال عملية spawned. إذا كان العدد الصحيح الثالث -1 ، فسيكون العدد الصحيح الرابع قيمة errno تعيين بواسطة نظام التشغيل. يتم أيضًا تعيين errorCode المتغير العام.

قد تظهر عناصر إضافية في نهاية قيمة الإرجاع من الانتظار . يحدد العنصر الخامس الاختياري فئة من المعلومات. حاليًا ، القيمة المحتملة الوحيدة لهذا العنصر هي CHILDKILLED وفي هذه الحالة تكون القيمتان التاليتان هما اسم إشارة النمط C ووصفاً نصياً قصيراً.

علامة -i تعلن عملية الانتظار المقابلة spawn_id المسماة (NOT معرف العملية ). داخل معالج SIGCHLD ، من الممكن الانتظار لأي عملية منتجة باستخدام spawn id-1.

يتسبب العلم -nowate في الانتظار للعودة فورًا مع الإشارة إلى انتظار ناجح. عندما تنتهي العملية (في وقت لاحق) ، فإنها ستختفي تلقائيًا دون الحاجة إلى انتظار صريح.

قد يتم أيضًا استخدام أمر الانتظار في انتظار عملية متشعبة باستخدام الوسيطات "-i -1". على عكس استخدامه مع العمليات الناتجة ، يمكن تنفيذ هذا الأمر في أي وقت. لا توجد سيطرة على أي عملية يتم جنيها. ومع ذلك ، يمكن التحقق من قيمة الإرجاع لمعرف العملية .

المكتبات

نتوقع تلقائيا معرفة اثنين من المكتبات المضمنة للنصوص المتوقعة. يتم تعريف هذه بواسطة الدلائل المسماة في المتغيرات exp_library و exp_exec_library. كلاهما يهدف إلى احتواء ملفات الأداة المساعدة التي يمكن استخدامها من قبل البرامج النصية الأخرى.

يحتوي exp_library على ملفات مستقلة عن المعمارية. يحتوي exp_exec_library على ملفات تعتمد على المعمارية. اعتمادا على النظام الخاص بك ، قد يكون كل الدلائل فارغة تماما. يوضح وجود ملف $ exp_exec_library / cat-buffers ما إذا كانت المخازن المؤقتة الخاصة بك / bin / cat بشكل افتراضي.

الطباعة الأنيقة

وهناك تعريف vgrind متاح للطباعة مخطوطات جميلة الطباعة. بافتراض تثبيت تعريف vgrind المزود بتوزيع Expect بشكل صحيح ، يمكنك استخدامه على النحو التالي:

vgrind -lexpect الملف

أمثلة

لا يتضح الكثيرون كيفية وضع كل شيء معًا تصفه صفحة الرجل . أنا أشجعك على قراءة وتجربة الأمثلة في الدليل المثال لتوزيع Expect . البعض منهم برامج حقيقية. البعض الآخر هو ببساطة توضيحية لبعض التقنيات ، وبالطبع ، الزوجان مجرد خارقة سريعة. ملف INSTALL يحتوي على نظرة عامة سريعة على هذه البرامج.

أوراق توقع (انظر انظر أيضا) هي مفيدة أيضا. في حين تستخدم بعض الأوراق صيغة تتطابق مع الإصدارات السابقة من Expect ، فإن المبررات المصاحبة لا تزال صالحة وتدخل في تفاصيل أكثر بكثير من هذه الصفحة.

المحاذير

قد تتعارض الإضافات مع أسماء الأوامر في Expect. على سبيل المثال ، يتم تعريف الإرسال بواسطة Tk لغرض مختلف تمامًا. لهذا السبب ، فإن معظم أوامر " توقع" متاحة أيضًا كـ "exp_XXXX". لا تحتوي الأوامر والمتغيرات التي تبدأ بـ "exp" و "inter" و "spawn" و "timeout" على أسماء مستعارة. استخدم أسماء الأوامر الموسعة إذا كنت بحاجة إلى هذا التوافق بين البيئات.

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

إذا لم تتمكن من تمكين إمكانية multispawning (على سبيل المثال ، لا يدعم النظام الخاص بك تحديد (BSD *. *) ، أو الاستطلاع (SVR> 2) ، أو أي شيء مكافئ) ، فإن Expect سيكون قادراً فقط على التحكم في عملية واحدة في كل مرة. في هذه الحالة ، لا تحاول تعيين spawn_id ، ولا يجب تنفيذ العمليات عبر exec أثناء تشغيل عملية spawned. علاوة على ذلك ، لن تتمكن من توقع عمليات متعددة (بما في ذلك المستخدم كواحد) في نفس الوقت.

يمكن أن يكون للمعلمات الطرفية تأثير كبير على البرامج النصية. على سبيل المثال ، إذا تمت كتابة نص برمجي للبحث عن echoing ، فسوف يعمل على نحو غير صحيح إذا تم إيقاف تشغيل echoing. لهذا السبب ، توقع قوى معلمات طرفية سليمة بشكل افتراضي. للأسف ، هذا يمكن أن يجعل الأشياء غير سارة للبرامج الأخرى. على سبيل المثال ، يريد shell emacs تغيير التعيينات "المعتادة": يتم تعيين خطوط جديدة إلى خطوط جديدة بدلاً من الخطوط الجديدة للعرض ، ويتم تعطيل echoing. هذا يسمح لأحد باستخدام emacs لتحرير خط الإدخال. لسوء الحظ ، لا يمكن توقع أن يخمن هذا.

يمكنك طلب أن لا يتجاوز تجاوز الإعداد الافتراضي لمعلمات المحطة الطرفية ، ولكن يجب أن تكون دقيقًا جدًا عند كتابة النصوص البرمجية لهذه البيئات. في حالة emacs ، تجنب الاعتماد على أشياء مثل echoing وتخطيطات نهاية السطر.

تستخدم الأوامر التي قُبلت الحجج في قائمة واحدة (المتغيرات المتوقعة والتفاعلية ) طريقة استكشافية لتحديد ما إذا كانت القائمة عبارة عن حجة واحدة أو الكثير. يمكن أن يفشل الاستدلال فقط في الحالة التي تمثل فيها القائمة فعليًا وسيطة واحدة تتضمن العديد من \ n بخطوط غير بيضاء بينهما. هذا يبدو غير محتمل بما فيه الكفاية ، ولكن يمكن استخدام الحجة "-nobrace" لفرض وسيطة واحدة ليتم التعامل معها كحجة واحدة. يمكن تصور استخدام هذا مع رمز Expect المتولد من الجهاز. وبالمثل ، تستدعي النسب-وسيطة واحدة التعامل مع أنماط / تصرفات متعددة.

بق

كان من المغري حقًا تسمية برنامج "الجنس" (إما "EXECUT" أو "Send-EXPECT") ، لكن الحس السليم (أو ربما مجرد التزمير) ساد.

في بعض الأنظمة ، عندما تفرخ القشرة ، تشكو من عدم القدرة على الوصول إلى tty ولكنها تعمل على أي حال. هذا يعني أن النظام الخاص بك لديه آلية للحصول على tty التحكم الذي لا يعرفه Expect عنه. يرجى معرفة ما هو ، وإرسال هذه المعلومات إليّ.

يعتبر Ultrix 4.1 (على الأقل أحدث الإصدارات هنا) أن المهلات التي تزيد عن 1000000 أعلاه تعادل 0.

ترفض Digital UNIX 4.0A (وربما إصدارات أخرى) تخصيص ptys إذا قمت بتعريف معالج SIGCHLD. انظر صفحة المنح للحصول على مزيد من المعلومات.

لا يقوم IRIX 6.0 بمعالجة أذونات pty بشكل صحيح بحيث إذا فشل في محاولة تخصيص pty مستخدمة من قبل شخص آخر ، فإنه يفشل. الترقية إلى IRIX 6.1.

تعليق Telnet (تم التحقق منه فقط تحت SunOS 4.1.2) في حالة عدم تعيين TERM. هذه مشكلة تحت cron ، في و cgi scripts ، والتي لا تحدد TERM. وبالتالي ، يجب عليك تعيينه بشكل صريح - إلى أي نوع يكون غير ذي صلة عادة. يجب أن يتم ضبطه على شيء ما! التالية ربما تكفي لمعظم الحالات.

ضع env (TERM) vt100

تعليق (تم التحقق منه فقط تحت BSDI BSD / OS 3.1 i386) معلقة إذا لم يتم تعيين SHELL و HOME. هذه مشكلة تحت cron ، في و cgi scripts ، والتي لا تحدد هذه المتغيرات البيئة. وبالتالي ، يجب عليك وضعها بشكل صريح - إلى ما هو نوع عادة غير ذي صلة. يجب أن يتم ضبطه على شيء ما! التالية ربما تكفي لمعظم الحالات.

set env (SHELL) / bin / sh set env (HOME) / usr / local / bin

تم تصميم بعض تطبيقات ptys بحيث يلقي kernel بعيدًا أي إخراج غير مقروء بعد 10 إلى 15 ثانية (العدد الفعلي يعتمد على التنفيذ) بعد أن تقوم العملية بإغلاق واصف الملف. هكذا نتوقع برامج مثل

تفرخ النوم 20 تتوقع

سوف تفشل. لتجنب هذا ، استدعاء البرامج غير التبادلية مع exec بدلاً من spawn . في حين أن مثل هذه الحالات يمكن تصورها ، إلا أنني في واقع الأمر لم أواجه مطلقًا أي حالة يخسر فيها الناتج النهائي لبرنامج تفاعلي حقيقي بسبب هذا السلوك.

من ناحية أخرى ، يقوم Cray UNICOS ptys برفض أي إخراج غير مقروء مباشرةً بعد أن تقوم العملية بإغلاق واصف الملف. لقد أبلغت هذا إلى Cray وهم يعملون على إصلاح.

في بعض الأحيان يكون التأخير مطلوبًا بين المطالبة والاستجابة ، مثل عندما تقوم واجهة tty بتغيير إعدادات UART أو مطابقة معدلات البث بالباود عن طريق البحث عن بتات البدء / التوقف. عادة ، كل هذا يتطلب أن ينام لمدة ثانية أو اثنتين. تقنية أكثر قوة هي إعادة المحاولة حتى الجهاز جاهز لتلقي الإدخال. يستخدم المثال التالي كلا الاستراتيجيتين:

أرسل "speed 9600 \ r"؛ sleep 1 تتوقع {timeout {send "\ r"؛ exp_continue} $ prompt}

لن يعمل رمز الاعتراض مع أي أمر يجلس في حلقة حدث Tcl ، مثل وضع السكون. المشكلة هي أنه في حلقة الحدث ، يتجاهل Tcl رموز الإرجاع من معالجات الأحداث المتزامنة. الحل هو تعيين علامة في رمز الاعتراض. ثم تحقق من العلم مباشرة بعد الأمر (أي النوم).

يتجاهل الأمر expect_background الحجج في المواقف وليس لديه فكرة عن المهلة بشكل عام.

& # 34؛ ملاحظات توضيحية & # 34؛

هناك بعض الأشياء حول توقع قد يكون غير بديهي. يحاول هذا القسم معالجة بعض هذه الأشياء باقتراحين.

مشكلة توقع الشائعة هي كيفية التعرف على مطالبات shell. وبما أن هذه المنتجات يتم تخصيصها بشكل مختلف من قبل أشخاص مختلفين وأصداف مختلفة ، فمن الممكن أن يكون تشغيل rlogin أوتوماتيكيًا أمرًا صعبًا دون معرفة المطالبة. هناك اتفاقية معقولة تتمثل في قيام المستخدمين بتخزين تعبير عادي يصف مطالبتهم (على وجه الخصوص ، في نهاية الأمر) في متغير البيئة EXPECT_PROMPT. كود مثل ما يلي يمكن استخدامها. إذا لم يكن EXPECT_PROMPT موجودًا ، فلا يزال هناك احتمال كبير بأن تعمل الشفرة بشكل صحيح.

set prompt "(٪ | # | \\ $) $"؛ # prompt prompt catch {set prompt $ env (EXPECT_PROMPT)} expect -re $ prompt

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

تتضمن معظم المطالبات حرف مسافة في النهاية. على سبيل المثال ، تكون المطالبة من ftp هي "f" و "t" و "p" و ">" و. لمطابقة هذه المطالبة ، يجب عليك حساب كل من هذه الأحرف. من الخطأ الشائع عدم تضمين الفراغ. ضع الفراغ بشكل واضح.

إذا كنت تستخدم نمطًا من النموذج X * ، فستتطابق العلامة * جميع المخرجات التي تم استلامها من نهاية X إلى آخر شيء تم تلقيه. يبدو هذا بديهيًا ولكن يمكن أن يكون مربكًا بعض الشيء لأن عبارة "آخر شيء تم تلقيه" يمكن أن تختلف باختلاف سرعة الكمبيوتر ومعالجة I / O من خلال النواة وبرنامج تشغيل الجهاز.

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

نتوقع ليس لديه طريقة لمعرفة أن المزيد من الإنتاج قادم ما لم يكن نمطك مسؤولا عن ذلك.

حتى اعتماداً على التخزين المؤقت الموجه الخط غير حكيم. لا تقتصر البرامج على تقديم وعود بشأن نوع التخزين المؤقت الذي تقوم به فقط ، ولكن عسر الهضم في النظام يمكن أن يكسر خطوط الإنتاج بحيث تتكسر الخطوط في أماكن تبدو عشوائية. وهكذا ، إذا كان بإمكانك التعبير عن آخر شخصيات قليلة من موجه عند كتابة الأنماط ، فمن الحكمة القيام بذلك.

إذا كنت تنتظر نموذجًا في آخر إخراج للبرنامج ، ثم يرسل البرنامج شيئًا آخر بدلاً من ذلك ، فلن تتمكن من اكتشاف ذلك باستخدام الكلمة الأساسية للمهلة . والسبب هو أن التوقع لن ينتهي - بل سيحصل على مؤشر eof . استخدم ذلك بدلا من ذلك. أفضل من ذلك ، استخدم كليهما. بهذه الطريقة إذا تم نقل هذا الخط في أي وقت ، فلن تضطر إلى تحرير الخط نفسه.

يتم تحويل الخطوط الجديدة عادةً إلى أحرف الإرجاع وتسلسلات التغذية عند الإخراج بواسطة برنامج التشغيل الطرفي. وهكذا ، إذا كنت تريد نمطًا يتطابق بشكل واضح مع الخطين ، من ، مثلا ، printf ("foo \ nbar") ، يجب استخدام النمط "foo \ r \ nbar".

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

بدلاً من استبدال الخطوط الجديدة يدويًا بالعائدات ، يكون الحل هو استخدام الأمر "stty raw" ، والذي سيؤدي إلى إيقاف الترجمة. ومع ذلك ، لاحظ أن هذا يعني أنك لن تحصل بعد الآن على ميزات تعديل الخطوط المطبوخة.

التفاعل بشكل ضمني يحدد الجهاز الخاص بك إلى وضع الخام حتى لا تنشأ هذه المشكلة بعد ذلك.

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

لسوء الحظ ، ليس لدى نظام ملفات UNIX طريقة مباشرة لإنشاء البرامج النصية القابلة للتنفيذ ولكن غير قابل للقراءة. قد تقوم الأنظمة التي تدعم البرامج النصية shell setgid بمحاكاة هذا بشكل غير مباشر على النحو التالي:

قم بإنشاء البرنامج النصي Expect (الذي يحتوي على البيانات السرية) كالمعتاد. اجعل أذوناته 750 (-rwxr-x ---) ومملوكة لمجموعة موثوق بها ، أي مجموعة مسموح لها بقراءتها. إذا لزم الأمر ، قم بإنشاء مجموعة جديدة لهذا الغرض. بعد ذلك ، قم بإنشاء برنامج نصي / bin / sh مع أذونات 2751 (-rwxr-s - x) تملكها نفس المجموعة كما كان من قبل.

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

& # 34 ؛ انظر أيضًا & # 34؛

Tcl (3)، libexpect (3)
"Exploring Expect: A T--Based Toolkit for Automating Interactive Programs" by Don Libes، pp. 602، ISBN 1-56592-090-2، O'Reilly and Associates، 1995.
"توقع: علاج تلك النوبات غير القابلة للسيطرة على التفاعل" من قبل Don Libes ، وقائع مؤتمر USENIX لعام 1990 ، Anaheim ، كاليفورنيا ، 11-15 يونيو ، 1990.
.I "استخدام توقع أتمتة مهام إدارة النظام" بواسطة Don Libes ، وقائع مؤتمر إدارة نظم التثبيت الكبير USENIX لعام 1990 ، كولورادو سبرينغز ، كولورادو ، 17-19 أكتوبر ، 1990.
. "Tcl: لغة أمر قابلة للتضمين" بقلم جون أوسترهوت ، وقائع مؤتمر USENIX لعام 1990 ، واشنطن العاصمة ، 22-26 يناير 1990. "أتوقع: مخطوطات للتحكم في البرامج التفاعلية" بواسطة Don Libes ، أنظمة الحوسبة ، المجلد. 4، No. 2، University of California Press Journals، November 1991..I "Regression Testing and Conformance Testing Interactive Programs"، by Don Libes، Proceedings of the Summer 1992 USENIX Conference، pp. 135-144، San Antonio، TX، يونيو 12-15 ، 1992..I "Kibitz - Connecting Interactive Interactive Programs Together"، by Don Libes، Software - Practice & Experience، John Wiley & Sons، West Sussex، England، Vol.

23، No. 5، May، 1993..I "A Debugger for Tcl Applications"، by Don Libes، Proceedings of the 1993 Tcl / Tk Workshop، Berkeley، CA، June 10-11، 1993.

مؤلف

دون ليبس ، المعهد الوطني للمعايير والتكنولوجيا

شكر وتقدير

بفضل جون أوسترهوت لـ Tcl ، و Scott Paisley للإلهام. شكراً لروب سافوي لرمز التكوين التلقائي الخاص بـ Expect.

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

دفعت الحكومة الأمريكية تصميم وتنفيذ التوقعات بشكل جزئي ، وبالتالي فهي في المجال العام. ومع ذلك ، فإن المؤلف و NIST يودان الحصول على ائتمان إذا تم استخدام هذا البرنامج والوثائق أو أجزاء منها.