باش: كيف تقاطع هذا البرنامج النصي عندما يكون هناك Ctrl-C؟
-
23-09-2019 - |
سؤال
لقد كتبت نصًا صغيرًا باش للعثور على جميع التغييرات الزئبقية (بدءًا من الحافة) التي تحتوي على السلسلة التي تم تمريرها في الوسيطة:
#!/bin/bash
CNT=$(hg tip | awk '{ print $2 }' | head -c 3)
while [ $CNT -gt 0 ]
do
echo rev $CNT
hg log -v -r$CNT | grep $1
let CNT=CNT-1
done
إذا قاطعته عن طريق ضرب Ctrl-C ، في أكثر الأحيان من غير ذلك ، فإن الأمر الذي تم تنفيذه حاليًا هو "HG LOG" وهو هذا الأمر الذي تتم مقاطعة ، ولكن بعد ذلك يستمر البرنامج النصي.
كنت أفكر بعد ذلك في التحقق من حالة إرجاع "سجل الزئبق" ، لكن لأنني أقوم بتنشيطها في Grep ، لست متأكدًا جدًا من كيفية القيام بذلك ...
كيف يجب أن أخرج من هذا البرنامج النصي عند مقاطعة؟ (راجع للشغل لا أعرف ما إذا كان هذا البرنامج النصي جيدًا على الإطلاق لما أريد القيام به ولكنه يقوم بالمهمة وعلى أي حال أنا مهتم بمسألة "متقطع")
المحلول
أعد كتابة البرنامج النصي الخاص بك مثل هذا ، باستخدام مجموعة $ pipestatus للتحقق من الفشل:
#!/bin/bash
CNT=$(hg tip | awk '{ print $2 }' | head -c 3)
while [ $CNT -gt 0 ]
do
echo rev $CNT
hg log -v -r$CNT | grep $1
if [ 0 -ne ${PIPESTATUS[0]} ] ; then
echo hg failed
exit
fi
let CNT=CNT-1
done
نصائح أخرى
ضع في بداية البرنامج النصي الخاص بك: trap 'echo interrupted; exit' INT
تعديل: كما هو مذكور في التعليقات أدناه ، ربما لا يعمل في برنامج OP بسبب الأنبوب. ال $PIPESTATUS
يعمل الحل ، ولكن قد يكون من الأسهل تعيين البرنامج النصي للخروج إذا خرج أي برنامج في الأنبوب مع حالة خطأ: set -e -o pipefail
ال $PIPESTATUS
سيسمح لك المتغير بالتحقق من نتائج كل عضو في الأنبوب.