बैश वैरिएबल में इमेज फाइल कैसे स्टोर करें?


14

मैं निम्नलिखित कमांड का उपयोग करने के बाद,

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

मैं PNG फ़ाइल के रूप में tmp.png नहीं खोल सकता। शायद कुछ जानकारी खो जाती है जब मैं $pngStringछवि फ़ाइल को संग्रहीत करने के लिए उपयोग करता हूं ।

तो सवाल यह है: मैं बैश स्क्रिप्ट में एक चर का उपयोग करके पूरी छवि जानकारी कैसे संग्रहीत कर सकता हूं?


बिल्ली आदेश ठीक काम करता है (छवि डेटा को चर में संग्रहीत करने के लिए)। बस दोहरे उद्धरण चिह्नों को हटा दें। सवाल यह है कि आप उन्हें चर में सहेजने के बाद इस डेटा के साथ क्या करना चाहते हैं?
coffeMug

5
catऔर echoइसके सभी ilk हृदय पाठ उपयोगिताओं में हैं। उन्हें द्विआधारी फाइलों पर बिना सोचे-समझे ढीला करने से अप्रत्याशित परिणाम होंगे। इसलिए चीजों base64का आविष्कार किया गया था।
शादुर

आप इसे एक चर के रूप में क्यों लेना चाहते हैं? शेल चर आमतौर पर छोटी मात्रा में पाठ संग्रहीत करने के लिए होते हैं, न कि बड़ी मात्रा में बाइनरी डेटा। सामान्य खोल में से कोई भी zsh को छोड़कर (चर null बाइट्स पर चोक) बाइनरी डेटा का सामना नहीं कर सकता है।
गिलेस एसओ- बुराई को रोकना '

अभी 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
OldTimer

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
कारेल Vlk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.