كيف يمكنني مسح المخزن المؤقت للمدخلات في برنامج نصي توقع؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

أنا أكتب نصا نتوقع ويواجه مشكلة في التعامل مع موجه Shell (على Linux). توقع بلدي تلبي البرامج النصية rlogin والنظام البعيد يستخدم ksh. وبعد يحتوي المطالبة على النظام البعيد على الدليل الحالي متبوعا " > " (مساحة أكبر من الفضاء). قد يكون مقتطف البرنامج النصي:

send "some command here\r"
expect " > "

هذا يعمل لأوامر بسيطة، لكن الأمور تبدأ في الظهور عندما يتجاوز الأمر الذي أرسله بعرض المحطة (أو أكثر بدقة، ما ksh يفكر هو عرض المحطة). في هذه الحالة، ksh هل بعض التمرير الأفقي الغريب لسطر الأوامر التفاعلي، والذي يبدو أنه يعيد كتابة المطالبة والعصي ">" الإضافي في الإخراج. بطبيعة الحال، يؤدي هذا إلى الخلط بين البرنامج النصي والخروج من المزامنة عندما يبدو أن هناك أكثر من موجه واحد في الإخراج بعد تنفيذ الأمر (يحتوي البرنامج النصي على عدة send/expect أزواج).

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

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

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

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

المحلول

إذا كنت ترغب في التخلص من جميع الإخراج، فقد شهدنا حتى الآن، حاول

expect -re $

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

نصائح أخرى

يمكنك تجربة "تعيين -o Multiline" أو الأعمدة = 1000000 (أو بعض قيمة كبيرة أخرى).

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

إذا كنت تستطيع تغيير تسجيل الدخول عن بعد إلى غير KSH (باستخدام الأمر Chsh أو تحرير / ETC / Passwd)، فقد تحاول ذلك باستخدام / bin / sh as the shell.

بديل آخر هو معرفة KSH أن المحطة هي محطة غبية - عدم السماح بها من القيام بأي معالجة خاصة.

$ export TERM=""

قد تفعل الخدعة.

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