दिलचस्प पोस्ट
दो वर्षों में महीने के आखिरी दिन का अनुक्रम जनरेट करें UIView को रेड्रा करने के लिए मजबूर करने के लिए सबसे मजबूत तरीका क्या है? क्या कोई जावास्क्रिप्ट फ़ंक्शन है जो एक निर्धारित लंबाई तक पहुंचने के लिए एक स्ट्रिंग पैड कर सकता है? एक मानक :: नक्शा जो प्रविष्टि के आदेश का ट्रैक रखता है? ActionBarSherlock और ActionBar अनुकूलता के बीच का अंतर डबल परिशुद्धता – दशमलव स्थान एक क्वेरी में दो तालिकाओं से हटाना पूर्ण पाठ खोज इंजन की तुलना – ल्यूसीन, स्फिंक्स, पोस्टग्रेस्क्ल, माईएसक्यूएल? मैं परिवर्तनों के लिए एक फाइल कैसे देखूं? फार्म तत्वों को गतिशील रूप से जोड़ने के लिए jQuery का उपयोग कैसे करें MySQL डेटटाइम के लिए जेएस दिनांक समय कन्वर्ट VS2010 Windows के 64-बिट संस्करण पर WinForms अनुप्रयोग में अप्रतिबंधित अपवाद संदेश नहीं दिखाता है अज्ञात प्रकार के साथ LINQ का चयन करें क्यों जावा इनर क्लास को "अंतिम" बाहरी इंस्टेंस चर की आवश्यकता होती है? XMLHttpRequest से प्रगति कैसे प्राप्त करें

एक बैश चर में कई लाइन आउटपुट कैप्चर करना

मेरे पास एक स्क्रिप्ट 'माइस्क्रिप्ट' है जो निम्नलिखित को आउटपुट करता है:

abc def ghi 

एक अन्य स्क्रिप्ट में, मैं कॉल करता हूं:

 declare RESULT=$(./myscript) 

और $RESULT मूल्य मिलता है

 abc def ghi 

परिणाम को न्यूलाइन के साथ या '\ n' चरित्र के साथ संचित करने का कोई तरीका है, इसलिए मैं इसे ' echo -e ' के साथ आउटपुट कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "एक बैश चर में कई लाइन आउटपुट कैप्चर करना"

असल में, RESULT में आप क्या चाहते हैं – प्रदर्शित करने के लिए:

 echo "$RESULT" 

आप जो दिखते हैं वह आप से क्या मिलता है:

 echo $RESULT 

जैसा कि टिप्पणियों में बताया गया है, अंतर यह है कि (1) चर का डबल-उद्धृत संस्करण ( echo "$RESULT" ) मान की आंतरिक रिक्ति को बिल्कुल सुरक्षित रखता है, जैसा कि इसे चर-न्यूलाइन, टैब, एकाधिक रिक्त स्थान और सभी – जबकि (2) अनक्ॉटेड संस्करण ( echo $RESULT ) एक या एक से अधिक रिक्त स्थान, टैब और एक लाइन के साथ नई लाइनों की प्रत्येक अनुक्रम को बदल देता है इस प्रकार (1) इनपुट वैरिएबल के आकार को संरक्षित रखता है, जबकि (2) एकल स्पेसेस (जहां 'शब्द' गैर-व्हाटस्पेस वर्णों का अनुक्रम है) से अलग 'शब्द' के साथ आउटपुट के संभावित रूप से बहुत लंबी एकल लाइन बनाता है; किसी भी शब्द में किसी भी अल्फ़ान्यूमेरिक्स नहीं हो सकता)।

इसके साथ एक और ख़तरा यह है कि कमांड प्रतिस्थापन – $() – नई लाइनों का अनुकरण स्ट्रिप्स शायद हमेशा महत्वपूर्ण नहीं है, लेकिन अगर आप वास्तव में उत्पादन को सही ढंग से संरक्षित करना चाहते हैं, तो आपको दूसरी पंक्ति और कुछ उद्धरणों का उपयोग करना होगा:

 RESULTX="$(./myscript; echo x)" RESULT="${RESULTX%x}" 

यह विशेष रूप से महत्वपूर्ण है अगर आप सभी संभावित फाइलनामों को संभालना चाहते हैं (गलत फ़ाइल पर काम करने की तरह अनिर्धारित व्यवहार से बचने के लिए)

@0000 के द्वारा दिए गए उत्तर के अतिरिक्त मुझे सिर्फ ऐसी परिस्थिति थी जहां मुझे स्क्रीप्ट द्वारा किसी अनुक्रमित नई लाइनों के उत्पादन को रखने और स्क्रिप्ट का रिटर्न कोड देखने की आवश्यकता थी। और एल 0 बी 0 के उत्तर के साथ समस्या यह है कि 'गूंज एक्स' $ रीसेट कर रहा था? शून्य से वापस … तो मैं इस बहुत ही चालाक समाधान के साथ आने में कामयाब रहा:

 RESULTX="$(./myscript; echo x$?)" RETURNCODE=${RESULTX##*x} RESULT="${RESULTX%x*}" 

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

 declare RESULT=($(./myscript)) # (..) = array echo "First line: ${RESULT[0]}" echo "Second line: ${RESULT[1]}" echo "N-th line: ${RESULT[N]}" 

इसके बारे में, यह प्रत्येक पंक्ति को एक चर में पढ़ता है और इसका इस्तेमाल बाद में किया जा सकता है! कहना है कि myscript आउटपुट myscript_output नामक फ़ाइल में पुनर्निर्देशित है

 awk '{while ( (getline var < "myscript_output") >0){print var;} close ("myscript_output");}' 

यहाँ पर अधिकांश समाधानों की कोशिश करने के बाद, सबसे आसान बात मैंने पाया – एक अस्थायी फ़ाइल का उपयोग करना मुझे यकीन नहीं है कि आप अपने एकाधिक लाइन आउटपुट के साथ क्या करना चाहते हैं, लेकिन फिर आप इसे पढ़ने के साथ लाइन से लाइन के साथ सौदा कर सकते हैं। केवल एक चीज के बारे में जो आप वास्तव में नहीं कर सकते हैं, वह सभी एक ही चर में आसानी से चिपक जाती है, लेकिन सबसे व्यावहारिक उद्देश्यों के लिए यह इस तरह से आसान है कि इससे निपटना आसान हो।

 ./myscript.sh > /tmp/foo while read line ; do echo 'whatever you want to do with $line' done < /tmp/foo 

अनुरोधित कार्य करने के लिए त्वरित हैक:

 result="" ./myscript.sh > /tmp/foo while read line ; do result="$result$line\n" done < /tmp/foo echo -e $result 

ध्यान दें यह अतिरिक्त लाइन जोड़ता है। यदि आप इस पर काम करते हैं तो आप इसके आसपास कोड कर सकते हैं, मैं बस बहुत आलसी हूँ


संपादित करें: हालांकि यह मामला पूरी तरह से अच्छी तरह से काम करता है, लेकिन इसे पढ़ने वाले लोगों को अवश्य पता होना चाहिए कि आप लूप के अंदर अपने स्टेडीन को आसानी से स्क्वाश कर सकते हैं, इस प्रकार आपको एक स्क्रिप्ट दी जाती है जो एक लाइन, स्पष्ट स्टडिन और बाहर निकलेंगी। जैसे मुझे लगता है कि ssh करेंगे? मैंने हाल ही में इसे देखा, अन्य कोड उदाहरण यहां दिए गए हैं: https://unix.stackexchange.com/questions/24260/reading-lines-from-a-file-with-bash-for-vs-while

एक और बार! इस समय एक अलग फाइलहैण्डल (stdin, stdout, stderr 0-2 रहे हैं, इसलिए हम उपयोग कर सकते हैं और 3 या उच्चतर bash में)।

 result="" ./test>/tmp/foo while read line <&3; do result="$result$line\n" done 3</tmp/foo echo -e $result 

आप mktemp का भी उपयोग कर सकते हैं, लेकिन यह सिर्फ एक त्वरित कोड उदाहरण है। Mktemp के लिए उपयोग की तरह लग रहा है:

 filenamevar=`mktemp /tmp/tempXXXXXX` ./test > $filenamevar 

फिर $ filenamevar का उपयोग करें जैसे कि आप फ़ाइल का वास्तविक नाम होगा। शायद यहाँ समझाया जाने की जरूरत नहीं है लेकिन किसी ने टिप्पणी में शिकायत की है