जवाबों:
आसान जवाब है क्योंकि ksh उस तरह से लिखा जाता है (और बैश संगत है)। लेकिन उस डिज़ाइन की पसंद का एक कारण है।
अधिकांश कमांड पाठ इनपुट की अपेक्षा करते हैं। यूनिक्स दुनिया में, एक पाठ फ़ाइल में एक अनुक्रम होता है, प्रत्येक एक नई पंक्ति में समाप्त होता है । इसलिए ज्यादातर मामलों में एक अंतिम नई लाइन की आवश्यकता होती है। एक विशेष रूप से सामान्य मामला एक कमांड के आउटपुट को कमांड सॉस्बट्रेशन के साथ हथियाना है, इसे किसी तरह से प्रोसेस करना है, फिर इसे दूसरे कमांड में पास करना है। कमांड सबस्टेशन अंतिम न्यूलाइन्स स्ट्रिप्स; <<<
एक वापस डालता है।
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
बैश और ksh किसी भी तरह से द्विआधारी डेटा में हेरफेर नहीं कर सकते हैं (यह अशक्त पात्रों के साथ सामना नहीं कर सकते हैं), इसलिए यह आश्चर्य की बात नहीं है कि उनकी सुविधाएं पाठ डेटा की ओर तैयार हैं।
<<<
यहां-स्ट्रिंग वाक्य रचना की तरह वैसे भी केवल सुविधा के लिए ज्यादातर है, <<
यहाँ-दस्तावेजों। यदि आपको अंतिम नई लाइन जोड़ने की आवश्यकता नहीं है, तो echo -n
(bash में) या printf
पाइपलाइन का उपयोग करें।
<<<
द्वारा बॉर्न दुनिया के लिए पेश किया गया था zsh
, नहीं ksh
। और यह यूनिक्स बंदरगाह में एक समान ऑपरेटर से प्रेरित था, rc
जिसने उस अतिरिक्त न्यूलाइन चरित्र को नहीं जोड़ा। दिलचस्प =(<<<text)
बात यह है कि ऑपरेटर उस न्यूलाइन को नहीं जोड़ता है zsh
।
printf
, जैसे आदि) में टेलिंग न्यूलाइन से बचा जा सकता है bash
? @ StéphaneChazelas की तरह बताया गया है zsh
।
एक ऐसा परिदृश्य जिसमें नई-नई रूपरेखाओं को यहाँ-वहाँ तार से जोड़ा जाना व्यावहारिक है, जब read
कमांड set -e
सक्रिय है तो मोड का उपयोग करते समय । याद रखें कि set -e
जब यह (अधिक या कम) बयानों को समाप्त करने के लिए एक स्क्रिप्ट का कारण बनता है जो एक गैर-शून्य स्थिति कोड उत्पन्न करता है। इस पर विचार करें कि read
जब कोई स्ट्रिंग बिना न्यूलाइन्स के आती है तो एक गैर-शून्य स्थिति कोड उत्पन्न करता है:
#!/bin/bash
set -e
# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'
# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'
मुझे लगता है कि यहां एक स्ट्रिंग के अंत में एक नई रूपरेखा प्राप्त करने का एकमात्र तरीका है, प्रमाण:
xxd <<<`echo -ne "a\n"`
ऐसा प्रतीत होता है कि जब तक वे आपके द्वारा प्रस्तुत सिंटैक्स में नहीं दिए जाते हैं, तब तक स्ट्रिंग-संचालक नई रूपरेखाएँ बनाते हैं।
xxd <<<$(echo a)
।