2015-03-30 6 views
6

स्क्रिप्ट test.sh नहीं बुलाया:ERR जाल जब केवल पढ़ने के लिए की स्थापना चर

set -euo pipefail 

function _trap_ext 
{ 
    echo '_trap_ext' 
} 
function _trap_error 
{ 
    echo '_trap_error' 
} 
trap "_trap_ext" EXIT 
trap "_trap_error" ERR 

readonly foo='bar' 
foo='bar' 

echo 'foobar' 

आउटपुट:

./test.sh: line 14: foo: readonly variable 
_trap_ext 

स्क्रिप्ट त्रुटि (-e विकल्प) की वजह से लाइन 14 पर समाप्त लेकिन _trap_error कार्य नहीं है बुलाया। क्यों नहीं?

जीएनयू बैश, संस्करण 4.1.2 (1) -release (x86_64-अज्ञात-linux-gnu), 4.2.45 (1) -release (i586-suse-linux-gnu)

+0

FWIW मेरे पास 4.3.33 में यह बग नहीं है, लेकिन मुझे [परिवर्तन लॉग] (http://tiswww.case.edu/php/chet/bash/CHANGES) में कुछ भी दिखाई नहीं देता है जो स्पष्ट रूप से इसके फिक्स को दर्शाता है। – kojiro

उत्तर

1

इस तरह लगता है यह एक बग हो सकता है। आदमी पृष्ठों से:

-e
तुरंत अगर बाहर निकलें एक पाइप लाइन (जो एक एकल साधारण आदेश शामिल हो सकते हैं), एक सूची, या एक यौगिक आदेश (ऊपर शेल देखें), एक गैर के साथ बाहर निकल जाता है -जेरो स्थिति।
...
ईआरआर पर एक जाल, सेट होने पर, खोल निकालने से पहले निष्पादित किया जाता है। यह विकल्प शैल पर्यावरण और प्रत्येक सबहेल पर्यावरण पर अलग-अलग लागू होता है (ऊपर COMMAND ENVIRONMENT देखें), और सबहेल में सभी आदेशों को निष्पादित करने से पहले सबहेल्स से बाहर निकलने का कारण बन सकता है।

आदमी पृष्ठों क्या कहते हैं, यह ERR जाल पर अमल करना चाहिए। foo='bar' कथन से पहले false डालने से आप परीक्षण कर सकते हैं कि यह अन्य परिस्थितियों में अपेक्षित काम करता है।

यह भी प्रतीत होता है कि बैश सिंटैक्स त्रुटियों पर ईआरआर जाल को कॉल नहीं करता है, इसलिए हो सकता है कि एक पठनीय चर को ओवरराइट करने का प्रयास एक समान श्रेणी की त्रुटियों में हो जो ईआरआर जाल को छोड़ दें। हालांकि, यह स्पष्टीकरण शुद्ध अटकलें है।

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