দুটি গুরুত্বপূর্ণ সমস্যা
যা এ পর্যন্ত অন্যান্য উত্তর দ্বারা উপেক্ষা করা হয়েছিল:
- কমান্ড সম্প্রসারণ থেকে নতুন লাইন অপসারণের অনুসরণ করা
- NUL চরিত্র অপসারণ
কমান্ড সম্প্রসারণ থেকে নতুন লাইন অপসারণের অনুসরণ করা
এটি এর জন্য একটি সমস্যা:
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"
পসিক্স কার্যক্রমে: কমান্ড প্রসারণে একটি অতিরিক্ত চর যুক্ত করুন এবং এটি পরে সরিয়ে দিন:
S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1
আউটপুট:
0000000 61 0a 0a
0000003
প্রায় পসিক্স কার্যক্রমে: এএসসিআইআই এনকোড। নিচে দেখ.
NUL চরিত্র অপসারণ
ভেরিয়েবলগুলিতে NUL অক্ষর সংরক্ষণ করার কোনও বুদ্ধিমান বাশ উপায় নেই ।
এটি সম্প্রসারণ এবং read
সমাধান উভয়কেই প্রভাবিত করে এবং আমি এর পক্ষে ভাল কোনও কার্যকারিতা জানি না।
উদাহরণ:
printf "a\0b" | od -tx1
S="$(printf "a\0b")"
printf "$S" | od -tx1
আউটপুট:
0000000 61 00 62
0000003
0000000 61 62
0000002
হা, আমাদের NUL চলে গেছে!
সমাধান নীচে উপস্থিত:
এএসসিআইআই এনকোড। নিচে দেখ.
ব্যাশ এক্সটেনশন $""
আক্ষরিক ব্যবহার করুন :
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 কিন্তু উবুন্টু 12.04 এ ডিফল্ট (দ্বারা sharutils
প্যাকেজ) ... আমি ব্যাশ প্রক্রিয়া কি POSIX 7 বিকল্প দেখতে পাচ্ছ<()
প্রতিকল্পন এক্সটেনশন অন্য ফাইল লেখা ছাড়া ...
অবশ্যই, এটি ধীর এবং অসুবিধাগুলি, তাই আমি অনুমান করি আসল উত্তরটি হ'ল: ইনপুট ফাইলটিতে NUL অক্ষর থাকতে পারে তবে ব্যাশ ব্যবহার করবেন না।
cat
বা$(<someFile)
একটি অসম্পূর্ণ আউটপুটে হবে (আকার বাস্তব ফাইল চেয়ে কম হয়)।