अगर "bash <file>" काम करता है, तो "source <file>" एक त्रुटि क्यों है?


26

मेरे पास निम्न स्क्रिप्ट है:

#!/bin/bash
set -x
if :; then
    echo a
fi

अगर मैं दौड़ता हूं bash /tmp/file, तो aयह गूँजता है, लेकिन अगर मैं दौड़ता source /tmp/fileहूं, तो मुझे मिलता है:

bash: /tmp/test: line 6: syntax error: unexpected end of file

उत्पादन:

knezi@holly tmp]$set -x; source /tmp/test; set +x
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$set -x; command source /tmp/test; set +x
+ set -x
+ command source /tmp/test
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x

knezi@holly tmp]$bash -c "source /tmp/test"
+ bash -c 'source /tmp/test'
++ :
++ echo a
a


knezi@holly tmp]$od -c /tmp/test
0000000   #   !   /   b   i   n   /   b   a   s   h  \n   s   e   t    
0000020   -   x  \n   i   f       :   ;       t   h   e   n  \n  \t   e
0000040   c   h   o       a  \n   f   i  \n
0000051

कमांड का आउटपुट shopt -pऔर set -o: http://pastebin.com/bsqc8aru

आउटपुट set: http://pastebin.com/S9KpqZAL

declare -fp कुछ नहीं पैदा करता है।

मैंने सोचा था कि sourceऐसा ही होता है bash, लेकिन नए सत्र को शुरू करने के बजाय वर्तमान में कोड चलाता है। क्या कोई मुझे इस त्रुटि की व्याख्या कर सकता है?

मैं bash GNU बैश, संस्करण 4.2.53 (1) -release (x86_64-redhat-linux-gnu) चलाता हूं।


1
नहीं, यह पूरा कोड है। न्यूलाइन्स 0 ए हैं।
knezi

2
@ यूनिक्स
लाइनफेड

2
है $BASH_ENVसेट?
रायमा

2
@ पीस्कोकिक जो वास्तव में अजीब है। bash -c "source / tmp / test" काम करता है।
knezi

5
आह-हा! कृपया जोड़ दें कि यह bash -cआपके प्रश्न के साथ काम करता है । फिर, हमें अपनी ~/.bashrcफ़ाइल की सामग्री दिखाएं , वहाँ शायद कुछ है जो चीजों को खराब कर रहा है।
terdon

जवाबों:


75

अगर मैं उर्फ ​​हूं तो मैं आपके व्यवहार को पुन: पेश कर सकता हूं fi:

$ alias fi=:
+ alias fi=:
$ . ./test
+ . ./test
++ set -x
bash: ./test: line 6: syntax error: unexpected end of file

जब आप इसे निष्पादित करते हैं तो यह काम करता है लेकिन जब आप इसे स्रोत करते हैं तो विफल हो जाता है क्योंकि उपनाम गैर-इंटरैक्टिव शेल (शेल प्रकार जो शेल स्क्रिप्ट चलाता है) में उपलब्ध नहीं हैं। बाश मैनुअल में बताया गया है :

जब तक शेल इंटरैक्टिव नहीं होता है, तब तक उपनाम का विस्तार नहीं किया जाता है, जब तक कि expand_aliasesशेल विकल्प का उपयोग करके सेट नहीं किया जाता है shopt(देखें शॉप्ट बिलिन )।

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


16
आप पूरी तरह से सही हैं। मैंने सेट किया है: अन्य उपनाम = 'खोज-प्रकार f | xargs grep -H '।
knezi

7
aliasअब इससे छुटकारा पाओ ! :)
मार्क स्टीवर्ट

9
मुझे अचरज हुआ कि कोई भी इस तरह की अस्पष्ट समस्या का पता लगाने में कामयाब रहा। अच्छा हुआ, सर।
MathematicalOrchid

6
@ मैमाटिकलिकल ऑर्चिड मुझे संदेह था कि कुछ अलियास किया गया था (इंटरेक्टिव शेल के कारण), setआउटपुट द्वारा खारिज कर दिया गया था, और alias if='foo "'(अनुगामी खुली बोली में गुम उद्धरण के बारे में एक त्रुटि दी गई थी, और इसलिए अंतिम विकल्प बदल रहा था fi
मुरु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.