2015-05-10 5 views
6

मैं कमांड लाइन का उपयोग कर रहा एक फ़ाइल में एक inplace प्रतिस्थापन प्रदर्शन करने के लिए पर्ल। (ध्यान दें sudo के साथ जड़ पर्म)गलत कमांड लाइन पर्ल त्रुटि मान?

sudo perl -i -pe "s/foo/bar/" config.txt 

इस सफल होता है, तो: इस कोड है 'गूंज $?'

sudo chattr +i config.txt 

मैं एक ही पर्ल आदेश चला और यह इस त्रुटि के साथ विफल:

Can't remove config.txt: Operation not permitted, skipping file.

कौन सा ठीक है लौटने 0. अब मैं फ़ाइल अन-लिखने योग्य भी जड़ के लिए इस तरह chattr का उपयोग कर सकते हैं। हालांकि, 'echo $?' अभी भी इस मामले में 0 लौटाता है। ऐसा क्यों है? क्या यह एक त्रुटि को इंगित करने वाले गैर-शून्य मान को वापस नहीं करना चाहिए?

उत्तर

2

समस्या यह है कि पर्ल इस स्थिति के लिए गैर-शून्य निकास स्थिति के साथ वापस नहीं आती है (sudo दिए गए आदेश की निकास स्थिति पर गुजरती है), जो थोड़ा परेशान है। यदि फ़ाइल में विफल रहता है का नाम बदलने की आप यह मानते हुए कि लाइन-पढ़ने पाश दर्ज नहीं किया गया है द्वारा समस्या को हल करने और एक ध्वज के साथ इसे संभाल कर सकते हैं:

sudo perl -i -ne 's/foo/bar/; print; $wrk = 1; }{ $wrk or exit 1' config.txt 

एस्किमो ग्रीटिंग (या तितली) "ऑपरेटर" }{ द्वारा प्रस्तुत एक END ब्लॉक, एक तरह से; जब फ़ाइल से लूप रीडिंग लाइन समाप्त हो जाती है तो इसे निष्पादित करने के बाद क्या आता है। जिस तरह से यह काम करता है उसे here वर्णित किया गया है।

चेतावनी है कि यह भी एक त्रुटि रिपोर्ट करेंगे अगर config.txt खाली है। एक छोटा सा हैकियर तरीका एक ही उद्देश्य के लिए विशेष $. लाइन काउंटर वैरिएबल का उपयोग करना है:

sudo perl -i -ne 's/foo/bar/; print; }{ $. or exit 1' config.txt 
+0

धन्यवाद। अच्छी तरह से काम। –

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