दो महत्वपूर्ण नुकसान
जिन्हें अब तक अन्य उत्तरों द्वारा अनदेखा किया गया था:
- कमांड विस्तार से नईलाइन को निकालना
- एनयूएल चरित्र हटाने
कमांड विस्तार से नईलाइन को निकालना
यह एक समस्या है:
value="$(cat config.txt)"
प्रकार के समाधान, लेकिन read
आधारित समाधान के लिए नहीं ।
कमांड विस्तार ने नई लाइनों को हटा दिया:
S="$(printf "a\n")"
printf "$S" | od -tx1
आउटपुट:
0000000 61
0000001
यह फाइलों से पढ़ने की भोली विधि को तोड़ता है:
FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(<"$FILE")"
printf "$S" | od -tx1
rm "$FILE"
POSIX वर्कअराउंड: अतिरिक्त विस्तार को कमांड एक्सटेंशन में जोड़ें और बाद में इसे हटा दें:
S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1
आउटपुट:
0000000 61 0a 0a
0000003
लगभग POSIX वर्कअराउंड: ASCII सांकेतिक शब्दों में बदलना। निचे देखो।
एनयूएल चरित्र हटाने
चर में NUL वर्णों को संग्रहीत करने के लिए कोई बैन बैश तरीका नहीं है ।
यह विस्तार और दोनों को प्रभावित करता है read
समाधान , और मुझे इसके लिए कोई अच्छा समाधान नहीं पता है।
उदाहरण:
printf "a\0b" | od -tx1
S="$(printf "a\0b")"
printf "$S" | od -tx1
आउटपुट:
0000000 61 00 62
0000003
0000000 61 62
0000002
हा, हमारा एनयूएल चला गया है!
समाधान:
ASCII सांकेतिक शब्दों में बदलना। निचे देखो।
बैश एक्सटेंशन $""
शाब्दिक का उपयोग करें :
S=$"a\0b"
printf "$S" | od -tx1
केवल शाब्दिक के लिए काम करता है, इसलिए फ़ाइलों से पढ़ने के लिए उपयोगी नहीं है।
नुकसान के लिए समाधान
वेरिएबल में फ़ाइल का एक यूएनकोड बेस 64 एनकोडेड संस्करण स्टोर करें और हर उपयोग से पहले डीकोड करें:
FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"
आउटपुट:
0000000 61 00 0a
0000003
uuencode और udecode POSIX 7 हैं, लेकिन डिफ़ॉल्ट रूप से ( sharutils
पैकेज) 12 Ubuntu में नहीं है ... मैं bash प्रक्रिया के लिए POSIX 7 विकल्प नहीं देखता<()
किसी अन्य फ़ाइल पर लिखने के अलावा प्रतिस्थापन एक्सटेंशन के ...
बेशक, यह धीमा और असुविधाजनक है, इसलिए मुझे लगता है कि असली उत्तर यह है: यदि इनपुट फ़ाइल में NUL वर्ण हो सकते हैं तो बैश का उपयोग न करें।
cat
या$(<someFile)
एक अधूरी उत्पादन में परिणाम होगा (आकार वास्तविक फ़ाइल से कम है)।