2010-08-13 17 views

उत्तर

15

शैल स्क्रिप्ट को निष्पादित करते समय लाइन-दर-रेखा आधार पर पार्स किया जाता है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि निष्पादन उस डेटा तक कभी न पहुंच जाए जो आप संरक्षित करना चाहते हैं। आप ऐसा कर सकता है, उदाहरण के लिए:

# Some shell code... 

exit 

[data (possibly binary) goes here] 

वास्तव में पढ़ने के लिए अपनी स्क्रिप्ट से इस डेटा, आपको कुछ एसईडी जादू का उपयोग कर सकते पहली पंक्ति केवल __DATA__ युक्त के बाद सब कुछ निकालने के लिए तो है कि sed के उत्पादन की दुकान एक चर में। एक

$ ./test-data.sh 
FOO BAR BAZ 
LLAMA DUCK COW 
+0

इस शांत है, कर सकते हैं किसी कृपया समझा कि यह कैसे काम करता है? मुझे समझ नहीं आया 'डेटा = $ (sed '0,/^ __ आंकड़े __ $/d'" $ 0 ")' – rodee

+0

भागो 'sed' आदेश और लाइन 0 से लाइन है कि __DATA__ मेल खाता है, लाइन को हटा दें। बाकी प्रिंट करेंगे। $ 0 यह स्क्रिप्ट है, पढ़ने के लिए फ़ाइल जिसमें डेटा है। – mpersico

+0

सावधान, यद्यपि; यदि आप अपनी स्क्रिप्ट में सोर्सिंग कर रहे हैं, न केवल इसे चला रहे हैं, तो '$ 0' आपका खोल नाम है और आपका' एक्जिट 'आपके पूरे सत्र से बाहर निकल जाएगा। '$ {' को' $ {BASH_ARGV [0]} 'और 'वापसी' के साथ' निकास' के साथ बदलें। – mpersico

3

सभी पर्ल की '__DATA__ "सबसे पहले pragma है:

#!/bin/sh 

data=$(sed '0,/^__DATA__$/d' "$0") 
printf '%s\n' "$data" 

exit 

__DATA__ 
FOO BAR BAZ 
LLAMA DUCK COW 

आप test-data.sh रूप में इस स्क्रिप्ट को बचाने और यह निष्पादन योग्य बनाने के लिए, आप इसे चलाने के लिए और निम्नलिखित उत्पादन प्राप्त कर सकते हैं: यहाँ एक उदाहरण है फ़ाइल निर्दिष्ट किए बिना $ _ में इनपुट की आपूर्ति करने का तरीका। बैश में कोई समकक्ष नहीं है क्योंकि इसमें $ _ के समान कुछ नहीं है। हालांकि आप सीधे डैश इत्यादि का उपयोग करते हुए स्पष्ट सेटिंग वैरिएबल जैसे अन्य तरीकों से डेटा की आपूर्ति कर सकते हैं।

हालांकि मुझे विश्वास नहीं है कि आप यही करना चाहते हैं। ऐसा कुछ प्रकार की ब्लॉक टिप्पणी विधि के बाद लगता है। क्या यह मामला है?

+0

हां, लेकिन दूसरा हिस्सा भी दिलचस्प है। तो मैं बाहर निकलने के समाधान को स्वीकार करूंगा हालांकि यह __DATA__ जितना अच्छा नहीं है क्योंकि __DATA__ के बाद कोई और वाक्यविन्यास-हाइलाइटिंग नहीं है और __DATA__ स्वयं बाहर निकलने के बजाय कोड में अधिक दिखाई दे रहा है। डेटा की आपूर्ति के लिए मैं शायद यहां एक दस्तावेज़ हूं क्योंकि बीटीसी के प्रस्ताव से याद रखना आसान है। –

+1

हां, हेड्रोक का उपयोग करना लगभग निश्चित रूप से एक स्क्रिप्ट को बड़ी मात्रा में डेटा की आपूर्ति के लिए सबसे अच्छा समाधान है। एकमात्र बार जब मैं अपने समाधान (अवधारणा के सबूत के अलावा) का उपयोग करता हूं तो मुझे एक शेल स्क्रिप्ट में डेटा को आसानी से शामिल करने की क्षमता की आवश्यकता होती है, जिसमें संभावित रूप से हेड्रोक टर्मिनेटर शामिल हो सकता है। – bcat

+0

आईआईयूसी, स्पष्ट रूप से चर सेट करने और हेड्रॉक्स का उपयोग करने से आपके डेटा के बीच में आपका डेटा सही स्मैक डैब होने का असर होगा। __DATA__ तकनीक अंत में उस डेटा को रखेगी ताकि आप संदर्भ में बाधा के बिना कोड पढ़ सकें। आईएमओ, डेटा के लिए इसका उपयोग इष्टतम नहीं है। बाहरी स्रोत से पढ़ने के लिए बेहतर है। लेकिन, यह एक स्व-दस्तावेज परीक्षण के लिए उपयुक्त हो सकता है। मैं केवल ऊपर के रूप में USAGE कथन के लिए इसका उपयोग करता हूं। – mpersico

0

यह एक उपयोगी तकनीक है यदि आप अपनी स्क्रिप्ट के लिए उपयोग जानकारी प्रदान करना चाहते हैं, लेकिन सहायता टेक्स्ट के साथ कोड की मुख्य पंक्ति को अव्यवस्थित नहीं करना चाहते हैं। यदि आप एक से अधिक बार उपयोग का संदर्भ देना चाहते हैं तो यह भी बढ़िया है। बुद्धि के लिए, मेरा एक खोल स्क्रिप्ट से एक टुकड़ा:

... 
declare OPTSARGS  
OPTSARGS=$(getoptp -o wh --long nopager,help -n myScript-- "[email protected]") 
status=$? 
if ((status != 0))  
then 
    printf '%s\n' "$(sed '0,/^__USAGE__$/d' $0)" 
    exit $status 
fi 
eval set -- "$OPTSARGS" 
while true 
do 
    case "$1" in 
     -w) diffargs="$diffargs -w"; shift;; 
     --nopager) pager=cat; shift;; 
     --) shift; break ;; ## end of opts, remaining $*, if any, are args 
     -h | --help) 
      printf '%s\n' "$(sed '0,/^__USAGE__$/d' $0)" 
      exit 0;; 
     *) 
      echo "Internal error!" 
      printf '%s\n' "$(sed '0,/^__USAGE__$/d' $0)" 
      exit 1;; 
    esac 
done 

... 

echo "Done" 
exit 0 

__USAGE__ 
myScript [-w] [--nopager] [file [file...] ] 

Some description goes here. 

     -w - Do not compare whitespace 
--nopager - Do not pass the output through 'less' 
संबंधित मुद्दे