जब आप यह आदेश चलाते हैं:
ls
टर्मिनल का आउटपुट प्रदर्शित करता है ls
।
जब आप यह आदेश चलाते हैं:
echo $(ls)
शेल इसके आउटपुट को कैप्चर $(ls)
करता है और इस पर शब्द विभाजन करता है। डिफॉल्ट के साथ IFS
, इसका मतलब है कि न्यूलाइन वर्णों सहित सफेद स्थान के सभी अनुक्रमों को एक रिक्त स्थान से बदल दिया जाता है। यही कारण है कि आउटपुट echo $(ls)
एक पंक्ति में दिखाई देता है।
शब्द विभाजन की एक उन्नत चर्चा के लिए, ग्रेग के अक्सर पूछे जाने वाले प्रश्न देखें ।
दमन शब्द का विभाजन
शेल उद्धरणों में तार पर शब्द विभाजन नहीं करता है। इस प्रकार, आप शब्द विभाजन को दबा सकते हैं और बहु-उत्पादन को बनाए रख सकते हैं:
echo "$(ls)"
ls
और बहुस्तरीय उत्पादन
आपने देखा होगा कि ls
कभी-कभी प्रति पंक्ति एक से अधिक फ़ाइल प्रिंट होती हैं:
$ ls
file1 file2 file3 file4 file5 file6
यह तब होता है जब ls
किसी टर्मिनल में आउटपुट जाता है। जब आउटपुट सीधे टर्मिनल पर नहीं जा रहा है, तो ls
इसकी डिफ़ॉल्ट प्रति लाइन एक फाइल में बदल जाती है:
$ echo "$(ls)"
file1
file2
file3
file4
file5
file6
इस व्यवहार में प्रलेखित है man ls
।
एक और सूक्ष्मता: आदेश प्रतिस्थापन और अनुगामी newlines
$(...)
है आदेश प्रतिस्थापन और के उत्पादन में से न्यू लाइन पात्रों अनुगामी खोल हटा आदेश प्रतिस्थापन । यह सामान्य रूप से ध्यान देने योग्य नहीं है, क्योंकि डिफ़ॉल्ट रूप से, echo
अपने आउटपुट के अंत में एक नई पंक्ति जोड़ता है। इसलिए, यदि आप के अंत से एक नईलाइन खोते हैं $(...)
और आप एक से लाभ प्राप्त करते हैं echo
, तो कोई बदलाव नहीं है। यदि, हालांकि, आपकी कमांड का आउटपुट 2 या अधिक न्यूलाइन वर्णों के साथ समाप्त होता है, जबकि echo
केवल एक वापस जुड़ता है , तो आपका आउटपुट एक या अधिक सुर्खियों में नहीं होगा। एक उदाहरण के रूप में, हम printf
अनुगामी न्यूलाइन वर्ण उत्पन्न करने के लिए उपयोग कर सकते हैं । ध्यान दें कि दोनों नई कमांड की अलग-अलग संख्याओं के बावजूद, एक ही लाइन के एक ही आउटपुट का उत्पादन करते हैं:
$ echo "$(printf "\n")"
$ echo "$(printf "\n\n\n\n\n")"
$
इस व्यवहार में प्रलेखित है man bash
।
एक और आश्चर्य: pathname विस्तार, दो बार
चलो तीन फाइलें बनाते हैं:
$ touch 'file?' file1 file2
ls file?
और बीच के अंतर को देखें echo $(ls file?)
:
$ ls file?
file? file1 file2
$ echo $(ls file?)
file? file1 file2 file1 file2
के मामले में echo $(ls file?)
, फ़ाइल ग्लोब file?
को दो बार विस्तारित किया जाता है , जिससे फ़ाइल नाम file1
और file2
आउटपुट में दो बार दिखाई देते हैं। इसका कारण यह है, जैसा कि जेफिकिन्स बताते हैं, pathname का विस्तार पहले शेल द्वारा किया जाता है, पहले ls
चलाया जाता है और फिर फिर से echo
चलने से पहले ।
यदि हम दोहरे उद्धरण चिह्नों का उपयोग करते हैं तो दूसरा पाथनेम विस्तार को दबाया जा सकता है:
$ echo "$(ls file?)"
file?
file1
file2