ব্যাশ ভেরিয়েবলে কোনও চিত্র ফাইল কীভাবে সংরক্ষণ করবেন?


14

আমি নিম্নলিখিত কমান্ডটি ব্যবহার করার পরে,

pngString="$(cat example.png)"    
echo -n "$pngString" > tmp.png

আমি পিএনজি ফাইল হিসাবে tmp.png খুলতে পারি না। আমি যখন $pngStringইমেজ ফাইলটি সঞ্চয় করতে ব্যবহার করি তখন কিছু তথ্য হারিয়ে যায় ।

সুতরাং প্রশ্নটি হল: আমি কীভাবে ব্যাশ স্ক্রিপ্টে ভেরিয়েবল ব্যবহার করে সম্পূর্ণ চিত্রের তথ্য সংরক্ষণ করতে পারি?


বিড়াল কমান্ডটি ভাল কাজ করে (ভেরিয়েবলের মধ্যে চিত্রের ডেটা সংরক্ষণ করার জন্য)। কেবল ডাবল উদ্ধৃতি মুছে ফেলুন। প্রশ্নটি হল এই ভেরিয়েবলটি সংরক্ষণের পরে আপনি এই ডেটাটি দিয়ে কী করতে চান?
coffeMug

5
catএবং এর echoসমস্ত সমস্যাগুলি হৃদয় পাঠ্য উপযোগে রয়েছে। বাইনারি ফাইলগুলিতে সন্দেহ ছাড়াই তাদের ছেড়ে দেওয়া অনির্দেশ্য ফলাফল পাবে। যে কারণে জিনিস base64আবিষ্কার করা হয়েছিল।
শাদুর

আপনি কেন এটি পরিবর্তনশীল হিসাবে রাখতে চান? শেল ভেরিয়েবলগুলি সাধারণত খুব পরিমাণে বাইনারি ডেটা নয়, স্বল্প পরিমাণে পাঠ্য সঞ্চয় করার উদ্দেশ্যে তৈরি হয়। সাধারণ শেলগুলির মধ্যে কোনও zsh ব্যতীত ভেরিয়েবলগুলিতে বাইনারি ডেটা (তারা নাল বাইটে দম বন্ধ করে) সামলাতে পারে না।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

শুধু cat example.png > tmp.pngবা কেন এখনও ভাল না cp example.png tmp.png?
ওয়াইল্ডকার্ড

@ শাদুর, catআসলেই কোনও পাঠ্য উপযোগ নয়। এটি কমান্ড সাবস্টিটিউশন (যা নিউলাইনগুলি অনুসরণ করে), ভেরিয়েবল অ্যাসাইনমেন্ট (যা নাল বাইটগুলি ধারণ করতে পারে না) এবং echoকমান্ডটি (যা ব্যাকস্ল্যাশ ক্রমগুলি ব্যাখ্যা করতে পারে) বাইনারিটি ছড়িয়ে দেবে, তা নয় cat। তবে আমি আপনার সামগ্রিক বিষয়টির সাথে একমত।
ওয়াইল্ডকার্ড

উত্তর:


20

আপনি ঠিক আছেন echoএবং সংস্থাগুলি বাইনারি ভালভাবে পরিচালনা করবে বলে মনে হয় না। আমি সন্দেহ করি যে নাল অক্ষরগুলি খুব তাড়াতাড়ি স্ট্রিমটি ভেঙে দেয়।

আপনি কিছু ASCII ভিত্তিক ফর্ম্যাটে চিত্রের তথ্য রূপান্তর করতে পারেন। উদাহরণস্বরূপ, এটি সাথে base64:

$ pic=`base64 pic.jpeg`
$ echo $pic | base64 --decode > pic2.jpeg
$ diff pic*
$ echo $?
0

3
আমার বাশ সিস্টেমে আমাকে উদ্ধৃতিগুলিতে ভেরিয়েবলটি আবদ্ধ করতে হয়েছিল, সম্ভবত বেস 64 এ সাদা স্থান থাকতে পারে: echo "$pic" | base64 --decode > pic2.jpeg
ওল্ডটাইমার

1

সমস্যাটি হ'ল নাল বাইটগুলি কমান্ড লাইন আর্গুমেন্টগুলির মাধ্যমে পাস করা যায় না কারণ সেগুলি অভ্যন্তরীণভাবে আর্গুমেন্ট টার্মিনেটর হিসাবে ব্যবহৃত হয়। অন্য সমস্ত বাইট ঠিক আছে বলে মনে হচ্ছে। সুতরাং ব্যবহারের জন্য আরও কিছু স্থান-দক্ষ (সাধারণত) বিকল্প base64হ'ল নাল বাইটগুলি থেকে বাঁচা এবং তারপরে ডেটাটিকে printfমূল আকারে রূপান্তর করতে ব্যবহার করা:

pngString="$(sed 's/\\/\\\\/g;s/%/%%/g;s/\x00/\\x00/g' <example.png)"
printf "$pngString" >tmp.png

\এবং %অক্ষর বিশেষ printfতাই তারাও পালিয়ে করা প্রয়োজন।

এছাড়াও নোট করুন যে যদি ইনপুট ডেটা একটি নতুন লাইন দিয়ে শেষ হয় তবে এটি কমান্ড প্রতিস্থাপনের মাধ্যমে ছিনিয়ে নেবে। এটি পিএনজির জন্য বিশেষত কোনও সমস্যা নয় কারণ বৈধ পিএনজির সর্বশেষ বাইট 0x82 হওয়া উচিত, খালি খণ্ডের IENDসিআরসি যোগফলের মধ্যে সর্বনিম্ন উল্লেখযোগ্য বাইট ।


1
আপনি যদি আরও ব্যাকস্ল্যাশগুলি চান তবে ব্যবহার করুন: sed s/\\\\/\\\\\\\\/g\;s/%/%%/g\;s/\\x00/\\\\x00/g
কারেল ভিএলকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.