2012-08-07 13 views
11

यह बैश की तरह लगता है, और डैश भी, मेरी स्क्रिप्ट से किसी भी ASCII एनयूएल को फ़िल्टर करें।मेरी एनक्रिप्ट से सभी एनयूएल क्यों हटाए गए हैं?

$ printf 'test="\000a" ; echo ${#test}' | sh 
1 
$ printf 'test="\001a" ; echo ${#test}' | sh 
2 
$ printf 'ec\000ho test' | sh 
test 
$ # (Same for bash) 

जबकि मैं मानता हूँ कि NUL का उपयोग कर एक बुरा बुरा विचार है (उदाहरण के तर्क कार्यक्रमों के लिए पारित करने के लिए NUL-समाप्त तार के साथ काम करता है), मैं जहां इस व्यवहार the POSIX standard द्वारा मंजूर किया गया है नहीं दिख रहा।

यह व्यवहार तब भी खराब हो जाता है जब यह व्यवहार फ़ाइल की सिंटैक्टिकल शुद्धता पर निर्णय लेता है।

$ printf 'echo "\\\000"' | sh 
sh: Syntax error: Unterminated quoted string 
$ printf 'echo "\\\000"' | bash 
bash: line 1: unexpected EOF while looking for matching `"' 
bash: line 2: syntax error: unexpected end of file 
$ printf 'echo "\\\134"' | sh 
\ 

क्या अनिवार्य हिस्सा मैं याद आती है था, या NUL-हटाने केवल कैसे अनिर्दिष्ट व्यवहार से निपटने के लिए पर एक निर्णय है?

+5

सभी sh कार्यान्वयन मैं सी स्ट्रिंग्स से परिचित हूं, जो - एनयूएल-समाप्त होने के कारण - उनकी प्रकृति द्वारा एनयूएल मूल्यों को पकड़ने में असमर्थ हैं। –

+2

zsh इन सभी परीक्षण मामलों को अच्छी तरह से संभालता है। –

+0

मैं यूनिक्स और लिनक्स से पूछने की कोशिश करता हूं, अगर @ चार्ल्सडफी का जवाब पर्याप्त नहीं है। – twmb

उत्तर

6

sh राज्यों के लिए मानक में निवेश फ़ाइलें अनुभाग:

इनपुट फ़ाइल एक पाठ फ़ाइल किया जाएगा, सिवाय इसके कि लाइन लंबाई असीमित होगा। यदि इनपुट फ़ाइल खाली है या केवल रिक्त रेखाओं या टिप्पणियों के होते हैं, या दोनों, sh शून्य निकास स्थिति से बाहर निकलेंगे।

एक फ़ाइल है कि शून्य या अधिक लाइनों में आयोजित वर्ण हैं:

शब्द "पाठ फ़ाइल" खंड 3.395 here के रूप में परिभाषित किया गया है। लाइनों में एनयूएल वर्ण नहीं होते हैं और कोई भी < न्यूलाइन > वर्ण सहित लंबाई में {LINE_MAX} बाइट से अधिक नहीं हो सकता है। हालांकि POSIX.1-2008 टेक्स्ट फ़ाइलों और बाइनरी फ़ाइलों (आईएसओ सी मानक देखें) के बीच अंतर नहीं करता है, लेकिन कई उपयोगिताएं केवल टेक्स्ट फ़ाइलों पर काम करते समय अनुमानित या सार्थक आउटपुट उत्पन्न करती हैं। मानक उपयोगिताओं जिनमें ऐसे प्रतिबंध हैं, उनके एसटीडीआईएन या इनपुट फ़ाइल अनुभागों में हमेशा "टेक्स्ट फाइलें" निर्दिष्ट करते हैं

यदि इनपुट टेक्स्ट फ़ाइल नहीं है (जो कि शून्य बाइट्स में नहीं है), तो व्यवहार न तो सार्थक है न ही अनुमानित।

+0

+1 जैसा लगता है कि मैं क्या देख रहा था। इसका मतलब है कि, मुझे लगता है कि एनयूएल पर निरस्त करने के लिए कार्यान्वयन की सलाह दी जाएगी। –

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