"अस्पष्ट रीडायरेक्ट" त्रुटि प्राप्त करना


173

मेरी बैश लिपि में निम्न पंक्ति

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

मुझे यह त्रुटि देता है:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

क्यों?


10
आप सब नहीं दिखा रहे हैं। जहां से मिला ${OUPUT_RESULTS}। इसका एक स्पेलिंग एरर है अगर आपका मतलब है$OUTPUT_RESULTS}
ghostdog74

अगर किसी ने लिखा है तो OUPUT_RESULTS = "filename.log"अस्पष्ट रीडायरेक्ट मिलेगा। क्योंकि bash =ऑपरेटर के आसपास NO SPACE चाहता है ।
पौटरथोर

जवाबों:


269

बैश कभी-कभी बहुत अप्रिय हो सकता है।

निम्न आदेश मूल रूप से एक ही त्रुटि के लिए अलग-अलग त्रुटि संदेश लौटाते हैं:

$ echo hello >
bash: syntax error near unexpected token `newline`

$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect

$ echo hello > "${NONEXISTENT}"
bash: : No such file or directory

चर के आसपास उद्धरण जोड़ना "अस्पष्ट रीडायरेक्ट" संदेश से निपटने का एक अच्छा तरीका प्रतीत होता है: जब आप टाइपिंग की गलती करते हैं तो आपको एक बेहतर संदेश मिलता है - और जब फ़ाइल नाम में रिक्त स्थान के कारण त्रुटि होती है, उद्धरणों का उपयोग करना ठीक है।


1
यदि आप किसी ऐसी स्क्रिप्ट के आउटपुट को रीडायरेक्ट करते हैं, जिसमें रीडायरेक्ट होता है, तो आपको यह भी मिलेगा। मुझसे यह मत पूछो कि मुझे यह कैसे पता है।
पॉल जैक्सन

@PaulJackson, ... यह सच नहीं है। कॉपी-एंड-पास्टेबल प्रदर्शनकारी के रूप में: sh -c 'echo hello >/tmp/hello' >/tmp/worldठीक से काम करता है।
चार्ल्स डफी

24

क्या आपके पास नाम का एक चर है OUPUT_RESULTSया यह अधिक संभावना है OUTPUT_RESULTS?


michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$ 

2
यदि आपका ABC="junk file.txt", यह अभी भी समस्या होगी।
चार्ल्स डफी

15

अपने चर के आसपास उद्धरण रखो। यदि यह रिक्त स्थान है, तो यह आपको "अस्पष्ट रीडायरेक्ट" भी देगा। अपनी वर्तनी भी जाँचें

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

अस्पष्ट रीडायरेक्ट की तरह

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag

1
उद्धरण मायने नहीं रखता। यदि चर विस्तार में स्थान हैं, तो आपको फ़ाइल नाम के पोस्ट-स्पेस हिस्से से संबंधित गलत फ़ाइल और / या गलत त्रुटि संदेशों पर जाने वाली चीज़ें मिलेंगी।
JUST MY सही OPINION

@JUSTMYcorrectOPINION, पैरामीटर एक्सपेंशन के बाद शेल फिर से पार्स नहीं करता है - जिसका अर्थ है कि विस्तार परिणामों के बाद की जगह के बाद सामग्री सिंटैक्स का एक अलग टुकड़ा भर नहीं सकती है।
चार्ल्स डफी

5

मैंने हाल ही में पाया है कि रीडायरेक्ट फ़ाइल के नाम पर खाली "अस्पष्ट रीडायरेक्ट" संदेश का कारण होगा।

उदाहरण के लिए यदि आप रीडायरेक्ट करते हैं application$(date +%Y%m%d%k%M%S).logऔर आप गलत फॉर्मेटिंग वर्णों को निर्दिष्ट करते हैं, तो रीडायरेक्ट 10 AM से पहले विफल हो जाएगा उदाहरण के लिए। हालाँकि, यदि आप इसका उपयोग application$(date +%Y%m%d%H%M%S).logकरते हैं तो यह सफल होगा। ऐसा इसलिए है क्योंकि %kप्रारूप 9AM के ' 9'लिए उपज देता है जहां 9AM के लिए %Hपैदावार '09'

echo $(date +%Y%m%d%k%M%S) देता है 20140626 95138

echo $(date +%Y%m%d%H%M%S) देता है 20140626095138

गलत तारीख कुछ इस तरह दे सकती है:

echo "a" > myapp20140626 95138.log

जहां निम्नलिखित वांछित होगा:

echo "a" > myapp20140626095138.log

त्रुटि यह है कि आपके पास चर के आसपास उद्धरण होने चाहिए, चाहे इसमें रिक्त स्थान हों। देखें कि शेल चर के आसपास कोट कब लपेटें?
ट्रिपल

5

क्या $ {OUPUT_RESULTS} में निर्दिष्ट पथ में कोई व्हाट्सएप वर्ण हैं? यदि हां, तो आप उपयोग करने पर विचार कर सकते हैं... >> "${OUPUT_RESULTS}" (उद्धरणों का उपयोग करके) ।

(आप अपने चर का नाम बदलने पर विचार करना चाह सकते हैं ${OUTPUT_RESULTS})


1

मुझे बस एक bash स्क्रिप्ट में यह त्रुटि मिली। यह समस्या पिछली पंक्ति के अंत में एक आकस्मिक \ _ थी जो एक त्रुटि दे रही थी।


1

एक अन्य चीज जो "अस्पष्ट रीडायरेक्ट" का कारण बन सकती है \t \n \rवह वह चर नाम है जिसे आप भी लिख रहे हैं

शायद नहीं \n\r? लेकिन सावधानी के पक्ष में

इसे इस्तेमाल करे

echo "a" > ${output_name//[$'\t\n\r']}

\tलाइन की शुरुआत में HTML, टैब्स को पार्स करते समय मैं इसके साथ हिट हो गया ।


त्रुटि चर को उद्धृत नहीं कर रही है। देखें कि शेल चर के आसपास कोट कब लपेटें?
ट्रिपल

1

यदि आपकी स्क्रिप्ट के रीडायरेक्ट में एक वैरिएबल है, और स्क्रिप्ट बॉडी उस वैरिएबल को परिभाषित करती है, जो कोष्ठक द्वारा संलग्न अनुभाग में है, तो आपको "अस्पष्ट रीडायरेक्ट" त्रुटि मिलेगी। यहाँ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है:

  1. vim a.sh स्क्रिप्ट बनाने के लिए
  2. स्क्रिप्ट को संपादित करने के लिए (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh निष्पादन योग्य बनाने के लिए
  4. a.sh

यदि आप ऐसा करते हैं, तो आपको "/home/ubuntu/a.sh: पंक्ति 1: $ लॉग: अस्पष्ट अप्रत्यक्ष" मिलेगा। यह है क्योंकि

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

कोष्ठक का उपयोग करने से लेकर समूह और अभिव्यक्तियों तक विस्तार

इसे ठीक करने के लिए, आप कोष्ठक के बाहर चर को परिभाषित करने के लिए चरण 2 में स्क्रिप्ट को संशोधित कर सकते हैं: logit="/home/ubuntu/test.log" && (echo "a") >> $logit


0

यदि आप शेल कमांड में एक वैरिएबल नाम का उपयोग कर रहे हैं, तो आपको इसे +साइन के साथ संक्षिप्त करना होगा ।

उदाहरण के लिए :

यदि आपके पास दो फाइलें हैं, और आप फ़ाइल नाम को हार्ड कोड में नहीं जा रहे हैं, इसके बजाय आप चर नाम का उपयोग करना चाहते हैं
"input.txt" = x
"output.txt" = y

तब ('उद्धरण के भीतर शेल कमांड' + x> + y)

यह इस तरह से काम करेगा, खासकर अगर आप इसे एक python प्रोग्राम में os.system कमांड के साथ उपयोग कर रहे हैं


0

यह मामला भी हो सकता है।

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

files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
    content=`cat $i` 
    echo "${content}  ${i}" >> ${out_file}
done

out_file वैरिएबल को सही तरीके से सेट नहीं किया गया है, इसलिए इस पर भी नजर रखें। BTW यह कोड कंसोल पर सभी सामग्री और उसके फ़ाइल नाम को प्रिंट कर रहा है।


0

कई फ़ाइलों में आउटपुट लिखने के लिए ब्रेस विस्तार का उपयोग करने की कोशिश करते समय मुझे यह त्रुटि मिली।

उदाहरण के लिए: echo "text" > {f1,f2}.txt परिणाम-bash: {f1,f2}.txt: ambiguous redirect

इस स्थिति में, teeएकाधिक फ़ाइलों के लिए आउटपुट का उपयोग करें:

echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null

1>/dev/nullकरने के लिए लिखा जा रहा से पाठ कर पाएगा stdout

यदि आप फ़ाइल (एस) के उपयोग के लिए संलग्न करना चाहते हैं tee -a

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