यहाँ-दस्तावेज़ 'फ़ाइल का अप्रत्याशित अंत' त्रुटि देता है


82

मुझे टर्मिनल से एक ईमेल भेजने के लिए मेरी स्क्रिप्ट की आवश्यकता है। मैंने यहाँ और कई अन्य स्थानों पर जो कुछ देखा है, उसके आधार पर, मैंने इसे इस तरह प्रारूपित किया:

/var/mail -s "$SUBJECT" "$EMAIL" << EOF
Here's a line of my message!
And here's another line!
Last line of the message here!
EOF

हालाँकि, जब मैं इसे चलाता हूं तो मुझे यह चेतावनी मिलती है:

myfile.sh: line x: warning: here-document at line y delimited by end-of-file (wanted 'EOF')

myfile.sh: line x+1: syntax error: unexpected end of file

... जहां लाइन एक्स प्रोग्राम में कोड की अंतिम लिखित लाइन है, और लाइन वाई /var/mailइसके साथ की रेखा है। मैंने EOFअन्य चीजों ( , आदि) के साथ बदलने की कोशिश की है ENDOFMESSAGE, FINISHलेकिन कोई फायदा नहीं हुआ। मैंने जो कुछ भी ऑनलाइन पाया है, वह लगभग इसी तरह से किया है, और मैं वास्तव में बहुत नया हूँ, इसलिए मुझे अपने दम पर इसे निकालने में मुश्किल समय आ रहा है। किसी को भी किसी भी मदद की पेशकश कर सकता है?


9
क्या EOFलाइन इंडेंटेड है? यह लाइन की शुरुआत में होना चाहिए।
बमर

यह है, लेकिन केवल जहाँ तक उस पूरे कथन का उल्लेख है। तो यह बाईं ओर सभी तरह से होना है?
thnkwthprtls 15

2
इसके अलावा, कोई अनुगामी चरित्र सुनिश्चित करें (गाड़ी वापसी सहित!)
ग्लेन जैकमैन

2
यदि आप केवल टैब वर्णों के साथ इंडेंट करते हैं , तो आप उपयोग कर सकते हैं <<-EOF- gnu.org/software/bash/manual/bashref.html#Here-Documents
ग्लेन जैकमैन

जवाबों:


157

EOFटोकन पंक्ति के आरंभ में किया जाना चाहिए, तो आप यह कोड के ब्लॉक इसके साथ चला जाता है के साथ इंडेंट नहीं कर सकते।

यदि आप लिखते <<-EOFहैं तो आप इसे इंडेंट कर सकते हैं, लेकिन इसे Tabपात्रों के साथ इंडेंट करना चाहिए , न कि स्पेस के साथ। इसलिए यह अभी भी कोड के ब्लॉक के साथ समाप्त नहीं हो सकता है।

यह भी सुनिश्चित करें कि आप कोई खाली स्थान के लिए है के बादEOF लाइन पर टोकन।


2
ऊपर दिए गए कोड उदाहरण में, ईओएफ टोकन लाइन की शुरुआत में है।
एंड्रयू कोस्टर

मैं इसे संपादित इतिहास में नहीं देखता, लेकिन यह मूल रूप से इंडेंट किया गया होगा, क्योंकि मैं इस समस्या को इंगित करने वाला एकमात्र व्यक्ति नहीं था।
बरमार

मुझे यह त्रुटि तब भी मिलती है जब मैं सभी अनावश्यक व्हाट्सएप को हटा देता हूं।
एंड्रयू कोस्टर

सीआर वर्णों के लिए जाँच करें, और dos2unixइसे ठीक करने के लिए उपयोग करें।
बरमार

17

यहाँ पर जो लाइन शुरू होती है या समाप्त होती है, उसमें संभवतः कुछ गैर-मुद्रण योग्य या व्हाट्सएप वर्ण होते हैं (उदाहरण के लिए, गाड़ी वापसी) जिसका अर्थ है कि दूसरा "EOF" पहले से मेल नहीं खाता है, और यहाँ-डॉक्टर की तरह समाप्त नहीं होता है यह होना चाहिए। यह एक बहुत ही सामान्य त्रुटि है, और केवल एक पाठ संपादक के साथ पता लगाना मुश्किल है। आप गैर-मुद्रण योग्य वर्णों को उदाहरण के लिए दृश्यमान कर सकते हैं cat:

cat -A myfile.sh

एक बार जब आप cat -Aसमाधान से आउटपुट देखते हैं, तो यह स्पष्ट हो जाएगा: अपमानजनक पात्रों को हटा दें।


7

कृपया पूर्ववर्ती स्थानों को हटाने का प्रयास करें EOF: -

/var/mail -s "$SUBJECT" "$EMAIL" <<-EOF

पहचान <tab>के <spaces>लिए उपयोग करना और << का उपयोग करना - EOF ठीक काम करता है।

"-"निकालता है <tabs>, नहीं <spaces>है, लेकिन कम से कम यह काम करता है।


2
पहला सुझाव मदद नहीं करेगा (क्या आपने यह देखने के लिए परीक्षण किया है कि क्या अंतरिक्ष एक समस्या का कारण बनता है?)। दूसरी केवल तभी मदद करेगी जब ईओएफ लाइन टीएबी के साथ इंडेंट की जाती है, न कि स्पेस के साथ।
बमर

मुझे लगता है कि समाप्त होने वाले टोकन में अग्रणी स्थान नहीं होना चाहिए
राहुल त्रिपाठी

2

ध्यान दें कि यदि आप ऐसा करते हैं तो यह त्रुटि भी हो सकती है;

while read line; do
  echo $line
done << somefile

क्योंकि इस मामले में << somefileपढ़ना चाहिए < somefile


0

यहाँ heredoc का उपयोग किए बिना कई इंडेंटेड लाइनों के साथ सौदा करने का एक लचीला तरीका है ।

  echo 'Hello!'
  sed -e 's:^\s*::' < <(echo '
    Some indented text here.
    Some indented text here.
  ')
  if [[ true ]]; then
    sed -e 's:^\s\{4,4\}::' < <(echo '
      Some indented text here.
        Some extra indented text here.
      Some indented text here.
    ')
  fi

इस समाधान पर कुछ नोट्स:

  • यदि सामग्री में सरल उद्धरण होने की अपेक्षा की जाती है, तो या तो \स्ट्रिंग का उपयोग करके या दोहरे कोट्स के साथ प्रतिस्थापित करें। उत्तरार्द्ध मामले में, सावधान रहें कि जैसे निर्माण की $(command)व्याख्या की जाएगी। यदि स्ट्रिंग में सरल और दोहरे दोनों उद्धरण हैं, तो आपको कम से कम तरह से बचना होगा।
  • दिए गए उदाहरण में एक अनुगामी खाली लाइन प्रिंट की जाती है, इससे छुटकारा पाने के कई तरीके हैं, प्रस्ताव को न्यूनतम गतिरोध में रखने के लिए यहां शामिल नहीं किया गया है
  • लचीलापन उस आसानी से आता है जिसके साथ आप यह नियंत्रित कर सकते हैं कि कितना अग्रणी स्थान रहना चाहिए या जाना चाहिए, बशर्ते कि आप कुछ sed REGEXP को जानते हों।

0

जब मैं करना चाहता हूँ docstrings मेरी पार्टी कार्यों के लिए, मैं एक समाधान के सुझाव के लिए इसी तरह का उपयोग user12205 एक में डुप्लिकेट इस सवाल का।

देखें कि मैं एक समाधान के लिए उपयोग को कैसे परिभाषित करता हूं:

  • मेरी पसंद के आईडीई (उदात्त) में मेरे लिए ऑटो प्रारूप
  • बहु-पंक्ति है
  • रिक्त स्थान या टैब का उपयोग इंडेंटेशन के रूप में कर सकते हैं
  • टिप्पणी के भीतर इंडेंटेशन को संरक्षित करता है।
function foo {
    # Docstring
    read -r -d '' USAGE <<'    END'
        # This method prints foo to the terminal.
        #
        # Enter `foo -h` to see the docstring.
        #      It has indentations and multiple lines.
        #
        # Change the delimiter if you need hashtag for some reason.
        # This can include $$ and = and eval, but won't be evaluated
    END


    if [ "$1" = "-h" ]
    then
        echo "$USAGE" | cut -d "#" -f 2 | cut -c 2-
        return
    fi

    echo "foo"
}

तो foo -hपैदावार:

This method prints foo to the terminal.

Enter `foo -h` to see the docstring.
     It has indentations and multiple lines.

Change the delimiter if you need hashtag for some reason.
This can include $$ and = and eval, but won't be evaluated

व्याख्या

cut -d "#" -f 2: #सीमांकित रेखाओं के दूसरे भाग को पुनः प्राप्त करें । (सीमेन्ट को "#" के साथ सीमांकक के रूप में सोचो, खाली पहला कॉलम)।

cut -c 2-: परिणामी स्ट्रिंग के अंत वर्ण को पुनः प्राप्त करें

यह भी ध्यान दें कि if [ "$1" = "-h" ]मूल्यांकन करता है जैसे कि Falseकोई पहला तर्क नहीं है, w / o त्रुटि, क्योंकि यह एक रिक्त स्ट्रिंग बन जाता है।


-1

बरमार और जोनी द्वारा उल्लिखित अन्य उत्तरों के साथ, मैंने देखा है कि मुझे कभी-कभी अपने ईओएफ का उपयोग करने से पहले और बाद में एक खाली लाइन छोड़नी पड़ती है <<-EOF


1
मुझे इसके लिए सिद्धांत या व्यवहार में कोई समर्थन नहीं मिला। अंधविश्वास के रूप में नीचा दिखाने वाले।
ट्रिपलए

1
मेरे पास एक मल्टीलाइन थी यहां-डॉके को रिडायरेक्ट करने के लिए पैरेंस में लिपटे हुए catऔर फॉर्मेटिंग के कारण, मेरे क्लोजिंग-डॉकर मार्कर के बंद होने से ठीक पहले मुझे क्लोजिंग पेरेन से पहले एक एन्टर जोड़ने की जरूरत थी अन्यथा मुझे यह मिसमैच मिलता। पूरी तरह से "कुछ" लोगों के लिए पूरी तरह से वैध होने के बावजूद, संभवतः एक संभावना नहीं है।
सिडॉफक

मुझे अंधविश्वास में योगदान करने से नफरत है, लेकिन मैं भी इस मुद्दे को उठा रहा था, और अपने ईओएफ के अंत के बाद एक रिक्त रेखा को जोड़ा। (डबक में 19.10 रनिंग; यह बूटस्ट्रैप.श लिपि में था)। रिक्त पंक्ति ने इस त्रुटि को ठीक किया।
NDP
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.