2011-08-01 12 views
18

का उपयोग कर फ़ाइल में टेक्स्ट का एक बड़ा हिस्सा गूंजें मुझे एक बैश स्क्रिप्ट चलाने की आवश्यकता है जो एक tmp फ़ाइल में ग्रोवी स्क्रिप्ट की 300 लाइनों को प्रतिबिंबित कर सकता है। इसे करने का सबसे अच्छा तरीका क्या है?बैश

मेरा वर्तमान वर्कअराउंड स्क्रिप्ट फ़ाइल को ऑनलाइन डाल रहा है और इसे डाउनलोड कर रहा है।

+0

क्या आप बस 'बिल्ली स्क्रिप्ट> tmp' नहीं कर सकते? – Saphrosit

उत्तर

33

एक खोल स्क्रिप्ट के भीतर अन्य स्क्रिप्ट एम्बेड करने के लिए हियरडॉक वाक्य-विन्यास का उपयोग करें:

cat > file.tmp <<'endmsg' 
script goes here... 
endmsg 
+6

उपयोगकर्ताओं को ध्यान रखना चाहिए कि रेखा पर उद्धरणों का उपयोग महत्वपूर्ण है यदि चिपकने वाली लिपि में शैल चर शामिल हैं - उद्धरण के बिना, उनका बिल्ली ऑपरेशन से पहले वर्तमान खोल द्वारा मूल्यांकन किया जाएगा; लेकिन उद्धरण के साथ वे सचमुच पेस्ट के रूप में अक्षर के रूप में प्रतिबिंबित किया जाएगा। –

21

हियरडॉक दृष्टिकोण बहुत अच्छा है, लेकिन आप इसे भोलेपन से उपयोग नहीं कर सकते:

मुद्दों
  • रहे हैं साथ चिपकाया सामग्री में रिक्त स्थान और टैब, जो परदे पर पढ़ने के लिए कठिन हैं, और आपके पाठ संपादक
  • की स्वत: सफाई कार्यों से शुरू हो रहा जा सकता है संरक्षण नहीं अंत के हियरडॉक मार्कर आप उपयोग चिपकाया में होती है सामग्री, ऑपरेशन होगा शुरुआती अंत - समस्या अगर सामग्री का अपना हेड्रोक है और 'ईओएफ' जैसे सामान्य मार्कर का उपयोग करता है।

इसका मतलब यह है एक अनुभवहीन हियरडॉक दृष्टिकोण सफल या सटीक सामग्री है कि में चिपकाया के आधार पर असफल हो सकता है। यही कारण है कि कम से कम विस्मय के सिद्धांत का उल्लंघन करता है और खतरनाक के बाद से अर्द्ध यादृच्छिक है।

मैं एक दृष्टिकोण जहां सामग्री पहले बेस 64 uuencode साथ कब्जा कर लिया है पसंद करते हैं। यह सामग्री के आधार पर विभिन्न व्यवहार की संभावना को समाप्त करता है, इसलिए आपको इसके बारे में कभी भी सोचना नहीं होगा।

सुरक्षित दृष्टिकोण:

  1. कब्जा करने के लिए सामग्री की पहचान करें, कहना whatever.sh
  2. uuencode -m whatever.sh whatever.sh >tmp
  3. स्क्रिप्ट आवरण
  4. एक हियरडॉक मार्कर का प्रयोग करें में tmp की सामग्री चस्पा करें कि नहीं कर सकते बेस 64

अंतिम स्क्रिप्ट इस तरह दिखता है:

cat > file.tmp <<'_EOF' 
begin-base64 644 whatever.sh 
bHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMg 
LWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxS 
CmxzIC1sUgpscyAtbFIKbHMgLWxSCmxzIC1sUgpscyAtbFIKbHMgLWxSCmxz 
IC1sUgpscyAtbFIK 
==== 
_EOF 
uudecode file.tmp 

एक छोटी संभावना है कि यूएनकोडेड डेटा की कोई भी पंक्ति आपके हेरेडोक मार्कर से मेल खा सकती है। आप शायद 60 वर्णों वाले मार्करों का उपयोग नहीं करेंगे :) लेकिन आखिरी पंक्ति कम हो सकती है और संभावना है कि यूनेकोडेड सामग्री आपके मार्कर से गलती से मेल खा सकती है, जब तक कि मार्कर किसी चरित्र (अंडरस्कोर) का उपयोग न करे, जो नहीं हो सकता बेस 64 एन्कोडिंग में। _EOF हमेशा सुरक्षित है।

ब्लॉक में शैल परिवर्तनीय विस्तार को रोकने के लिए '_EOF' जैसे हेड्रोक मार्कर को उद्धृत करना भी समझदार है। मुझे नहीं लगता कि बेस 64 एन्कोडेड पेलोड कभी भी अनजाने में एक शेल वैरिएबल का संदर्भ दे सकता है क्योंकि $ बेस 64 में उपयोग नहीं किया जाता है, लेकिन उद्धरण इस संभावना को समाप्त करता है। यह हेड्रोक मार्कर को हमेशा उद्धृत करने की आदत को स्थापित करने में भी मदद करता है जब तक कि कोई कारण नहीं है कि आप खोल विस्तार चाहते हैं। यह एक और सामग्री-निर्भर व्यवहार है जो स्पष्ट रूप से यादृच्छिक रूप से मुश्किल है। हमेशा अपने हेरेडोक मार्कर को उद्धृत करें जबतक कि आप नहीं जानते कि आप सामग्री ब्लॉक के भीतर खोल विस्तार चाहते हैं!

उपरोक्त एक मैन्युअल प्रक्रिया है। टेम्पलेट्स का उपयोग करके इसे स्वचालित करना आसान है।

2

जब आप किसी फ़ाइल को आउटपुट करना चाहते हैं जिसके लिए आपको sudo का उपयोग करने की आवश्यकता है, तो उत्तर पूरी तरह से स्पष्ट नहीं है!

sudo tee /etc/php/conf.d/xdebug.ini > /dev/null <<'TXT' 
zend_extension=xdebug.so 
xdebug.remote_enable=on 
xdebug.remote_autostart=on 
xdebug.remote_host=127.0.0.1 
xdebug.remote_port=9000 
xdebug.remote_handler=dbgp 
TXT