سؤال

أرغب في عمل برنامج نصي يبدأ برنامجًا ثم يرسله إدخال مفتاحه. في Psuedo-Script:

#!/bin/bash
./program << (PRESS CONTROL-Z)

يتم تشغيل البرنامج ، لذلك إذا كان هناك أوامر إضافية في البرنامج النصي ، فلن يتم الوصول إليها ما لم ينهي Control-Z البرنامج.

هل هذا ممكن؟ من ما وجدته ، اعتقدت أنه قد يتطلب رموز رئيسية ولكن قد أكون مخطئًا.

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

المحلول

قد تبحث عنه expect (من عند http://expect.nist.gov/). هذا يتعامل مع تعقيدات tyts الزائفة التي تجعلها تظهر للبرنامج أن المدخلات من البرنامج النصي (في هذا السيناريو ، expect البرنامج) يأتي من محطة.

بدلاً من ذلك ، قد تكون قادرًا على الاستخدام echo أو cat وأنبوب إخراج ذلك في البرنامج - يعتمد على البرنامج.

نصائح أخرى

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

يستخدم

`printf "character code here"` 

لاحظ backticks

لذلك على سبيل المثال ، كتبت برنامجًا نصيًا يتحكم في جلسة شاشة GNU عن بُعد ، ويفتح السطر التالي نافذة 2 ويصدر مجموعة مفتاح Ctrl-C

ssh -t user@$host screen -p 2 -X stuff `printf "\003"`
  • يحاكي خيار -T المدخلات الطرفية على الجهاز البعيد
  • -P يتيح لنا تحديد اسم أو رقم النافذة التي نتصل بها داخل جلسة الشاشة.
  • 003 هو تنسيق باش لرمز الأحرف 0x03

يرى هنا للحصول على مرجع كامل للرموز.

للعثور على رمز بعض إدخال المفاتيح الذي يمكنك استخدامه

printf "%#x\n" "'X"
0x58
  • هل كان X هو المفتاح الذي تريد العثور عليه في رمز
  • للعثور على رموز غير حرفية ، يمكنك استخدام CTRL-V (يجعل Bash إلحاق المفتاح التالي إلى سطر الأوامر بدلاً من التغلب عليه) ثم اكتب التحرير والسرد المفتاح ، لذلك إذا أردت العثور على رمز المفتاح لـ Ctrl-C I حذف x اضغط على Ctrl-V ثم اضغط على Ctrl-C.

آخر شيء آخر مرجع رمز ASCII المذكور أعلاه يسرد 0x13 كعودة النقل ، ولكن في دليل الشاشة يدرج 0x15 ككود المفتاح إدخال ، هل يعرف أي شخص لماذا؟ تم اختباره في شاشة محلية وعندما أضغط على إدخال 0x13 ، ولكن عند إرسال أوامر عبر SSH إلى شاشة بعيدة 0x13 لا تعمل ولكن 0x15 لا يعمل.

امل ان يساعد

أرصفة

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

#!/bin/bash
./program&

إذا كانت نيتك هي خلفية البرنامج ، فاستخدم:

./program &    # The & sends the command to the background
echo commands here are executed while program is in the background
…
wait           # Wait for the completion of background commands
echo commands here are executed after background program has completed

تعديل: إذا كانت نيتك هي إيقاف البرنامج (كما يفعل Ctrl-Z غالبًا في *nix shells) ، فيمكنك إرسال إشارة التوقف:

kill -STOP pid

لاستئناف التنفيذ ، أرسلها إشارة تابع:

kill -CONT pid

في كل من هذه الأمثلة pid هو معرف العملية للبرنامج. إذا قمت بتشغيله في برنامج نصي ، فمن السهل الحصول على المتغير $!, ، على سبيل المثال

./prog &
echo prog started in the background
pid_of_prog=$!
kill -STOP $pid_of_prog
echo prog stopped
kill -CONT $pid_of_prog
echo prog continues
wait
echo prog finished

تحرير 2: إذا كان البرنامج الخاص بك يخرج عندما يتلقى حرفًا من CTRL-Z ، فتذكر أن أحرف التحكم لها القيمة العددية لرسالة الموضع في الأبجدية (أي Ctrl-A هي 1 ، Ctrl-B هي 2 ، إلخ). . لإرسال هذه الشخصية إلى برنامج يمكنك:

echo -e "\032" | ./prog

(032 هو 26 ، أي ^z ، في الثمن. بالطبع يمكنك إنتاج نفس الشخصية بأي وسيلة ، ربما تضيفها إلى نهاية المدخلات الأخرى مثل ( cat inputfile ; echo -e "\032" ) | ./prog.

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

وأخيراً ، إذا كان القصد هو إيقاف تنفيذ البرنامج عندما حدث حدث آخر (تم اكتشافه في مكان آخر في البرنامج النصي) ، فيمكنك فقط kill هو - هي…

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