باش: كيف تقاطع هذا البرنامج النصي عندما يكون هناك Ctrl-C؟

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

  •  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 سيسمح لك المتغير بالتحقق من نتائج كل عضو في الأنبوب.

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