2010-10-28 9 views
6

मैं निम्नलिखित बैश स्क्रिप्ट है:बैश स्क्रिप्ट तुरंत बाहर निकलने नहीं जब `exit` कहा जाता है

tail -F -n0 /private/var/log/system.log | while read line 
do 
    if [ ! `echo $line | grep -c 'launchd'` -eq 0 ]; then 
     echo 'launchd message' 
     exit 0 
    fi 
done 

किसी कारण के लिए, यह, launchd message गूंज रहा है एक पूर्ण 5 सेकंड के लिए इंतजार कर रहे हैं, और तो बाहर निकलने।

यह क्यों हो रहा है और यह launchd message echos के तुरंत बाद इसे कैसे बाहर निकल सकता है?

उत्तर

9

चूंकि आप पाइप का उपयोग कर रहे हैं, while लूप को सबहेल में चलाया जा रहा है। इसके बजाए इसे मुख्य खोल में चलाएं।

#!/bin/bash 

while ... 
do 
    ... 
done < <(tail ...) 
+0

मैंने किया लाइन में एक सिंटैक्स त्रुटि हो रही है ... – Chetan

+0

आह, यह था, क्योंकि मैं उपयोग कर रहा था/bin/श, मुझे बेवकूफ। – Chetan

+0

बाश को आमंत्रित करने के रूप में प्रक्रिया प्रतिस्थापन सहित कुछ विशेषताओं को अक्षम करता है। –

3

जैसा कि इग्नासिओ द्वारा इंगित किया गया है, आपका tail | while एक सबहेल बनाता है। देरी इसलिए है क्योंकि यह सब कुछ बंद होने से पहले लॉग फ़ाइल में अगली पंक्ति को लिखा जा रहा है।

यदि आप प्रक्रिया प्रतिस्थापन का उपयोग नहीं करना चाहते, अपने exit आदेश से ठीक पहले इस लाइन जोड़ सकते हैं:

kill -SIGPIPE $$ 

दुर्भाग्य से, मैं इस पद्धति का उपयोग बाहर निकलने के कोड को नियंत्रित करने के लिए किसी भी तरह का पता नहीं है। यह 141 होगा जो 128 + 13 (सिग्नल नंबर SIGPIPE) होगा।

यदि आप शुरू किए गए किसी अन्य व्यक्ति पर निर्भर डिमन की स्टार्टअप करने की कोशिश कर रहे हैं, तो ऐसा करने का शायद एक बेहतर तरीका है।

वैसे, अगर तुम सच में एक बैश स्क्रिप्ट (जो आप <() प्रक्रिया प्रतिस्थापन उपयोग करने के लिए रहना होगा चाहते हैं) लिख रहे हैं, तो आप लिख सकते हैं अपने if इस तरह: if [[ $line == *launchd* ]]

2

आप एक टेल-टेल निकास कोड के साथ सबहेल से बाहर निकल सकते हैं और फिर "$?" के मूल्य का परीक्षण कर सकते हैं। एक ही प्रभाव आप देख रहे हैं पाने के लिए:

tail -F -n0 /private/var/log/system.log | while read line 
do 
    if [ ! `echo $line | grep -c 'launchd'` -eq 0 ]; then 
     echo 'launchd message' 
     exit 10 
    fi 
done 
if [ $? -eq 10 ]; then exit 0; fi 
संबंधित मुद्दे