2010-03-31 9 views
6

मैं एक छोटे से बैश पटकथा लिखी (टिप से शुरू) सभी मर्क्युरियल changesets खोजने के लिए स्ट्रिंग दिया गया तर्क होता है कि:बैश: CTRL-C होने पर इस स्क्रिप्ट को कैसे बाधित किया जाए?

#!/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" है और यह वह आदेश है जो बाधित हो जाता है, लेकिन फिर मेरी स्क्रिप्ट जारी है।

मैं तो की "एचजी लॉग ऑन" वापसी की स्थिति की जांच के बारे में सोच रहा था, लेकिन क्योंकि मैं इसे ग्रेप में पाइप कर रहा हूँ मैं भी यकीन है कि के रूप में कैसे इसके बारे में जाने के लिए नहीं कर रहा हूँ ...

कैसे करना चाहिए जब मैं बाधित होता हूं तो मैं इस स्क्रिप्ट से बाहर निकलने के बारे में जाता हूं? (बीटीडब्ल्यू मुझे नहीं पता कि वह स्क्रिप्ट क्या है जो मैं करना चाहता हूं, लेकिन यह नौकरी करता है और वैसे भी मुझे "बाधित" समस्या में दिलचस्पी है)

उत्तर

5

इस तरह अपनी स्क्रिप्ट पुनर्लेखन, एक विफलता के लिए जाँच करने के लिए $ 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 
+0

बहुत बहुत धन्यवाद, सभी को +1। ठीक काम करना :) – SyntaxT3rr0r

+0

मुझे शायद यह इंगित करना चाहिए कि आर्किपू का उल्लेख किया गया $ PIPESTATUS और पाइपफेल विकल्प दोनों संस्करण संस्करण 3+ विशिष्ट हैं। वे अन्य गोले द्वारा समर्थित नहीं हैं। –

+0

धन्यवाद, मेरे डेबियन लिनक्स पर मेरे पास वास्तव में बैश 3+ है लेकिन मेरे मैक पर यह बैश 2.05 है। – SyntaxT3rr0r

1

$PIPESTATUS वेरिएबल आपको चेक करने की अनुमति देगा पाइप के हर सदस्य के परिणाम।

6

अपनी स्क्रिप्ट की शुरुआत में स्थान: trap 'echo interrupted; exit' INT

संपादित करें: नीचे टिप्पणी में बताया गया है, शायद पाइप की वजह से ओ पी के कार्यक्रम के लिए काम नहीं करता। $PIPESTATUS समाधान काम करता है, लेकिन यह करता है, तो एक त्रुटि स्थिति के साथ पाइप बाहर निकलता है में किसी भी कार्यक्रम बाहर निकलने के लिए स्क्रिप्ट स्थापित करने के लिए आसान हो सकता है: set -e -o pipefail

+0

जाल कमांड केवल उन प्रक्रियाओं के साथ काम करता है जो स्वयं को बाधित नहीं करते हैं। अगर स्क्रिप्ट को बाधा मिल रही थी, तो यह पहले से ही निरस्त हो जाएगी। –

+0

आह, इसके बारे में खेद है, मैंने ओपी की लिपि में पाइप को याद किया। एक बेहतर उत्तर यह हो सकता है: सेट -e पाइपफेल – Arkku

+0

आपका पहला समाधान (जाल) किसी भी प्रक्रिया के साथ काम करेगा जो स्वयं को बाधित नहीं करता है - * ढूंढ * एक लंबी चल रही प्रक्रिया का एक अच्छा उदाहरण है बाधा को पार करने के कारण, बाधा से गुजरती है। जाल को क्लीनअप करने के लिए तत्काल निरस्त होने से रोकने के लिए इस्तेमाल किया जा सकता है, जैसे विनाशक या फाइनलाइज़र। यह जानने के लिए एक आसान आदेश है। –

संबंधित मुद्दे