أرسل رمز المفتاح إلى برنامج سطر الأوامر على OS X
سؤال
أرغب في عمل برنامج نصي يبدأ برنامجًا ثم يرسله إدخال مفتاحه. في 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
هو - هي…