एक बैश यहाँ-स्ट्रिंग एक अनुगामी न्यूलाइन चार क्यों जोड़ता है?


34

निम्न उदाहरण बताते हैं कि एक नया -तार यहाँ एक स्ट्रिंग में जोड़ा गया है ।
ऐसा क्यों किया जाता है?

xxd -p <<<'a'  
# output: 610a

xxd -p <<<'a
'
# output: 610a0a

जवाबों:


38

आसान जवाब है क्योंकि ksh उस तरह से लिखा जाता है (और बैश संगत है)। लेकिन उस डिज़ाइन की पसंद का एक कारण है।

अधिकांश कमांड पाठ इनपुट की अपेक्षा करते हैं। यूनिक्स दुनिया में, एक पाठ फ़ाइल में एक अनुक्रम होता है, प्रत्येक एक नई पंक्ति में समाप्त होता है । इसलिए ज्यादातर मामलों में एक अंतिम नई लाइन की आवश्यकता होती है। एक विशेष रूप से सामान्य मामला एक कमांड के आउटपुट को कमांड सॉस्बट्रेशन के साथ हथियाना है, इसे किसी तरह से प्रोसेस करना है, फिर इसे दूसरे कमांड में पास करना है। कमांड सबस्टेशन अंतिम न्यूलाइन्स स्ट्रिप्स; <<<एक वापस डालता है।

tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp

बैश और ksh किसी भी तरह से द्विआधारी डेटा में हेरफेर नहीं कर सकते हैं (यह अशक्त पात्रों के साथ सामना नहीं कर सकते हैं), इसलिए यह आश्चर्य की बात नहीं है कि उनकी सुविधाएं पाठ डेटा की ओर तैयार हैं।

<<<यहां-स्ट्रिंग वाक्य रचना की तरह वैसे भी केवल सुविधा के लिए ज्यादातर है, <<यहाँ-दस्तावेजों। यदि आपको अंतिम नई लाइन जोड़ने की आवश्यकता नहीं है, तो echo -n(bash में) या printfपाइपलाइन का उपयोग करें।


मेरे उत्तर से बहुत अधिक पूरी तरह से।
माइक

2
बैश ksh93 से यहाँ-तार उधार लिया सकता है, लेकिन बदले में ksh उन्हें zsh है, जो उन्हें योजना 9 खोल से मिला से उधार rc
मार्क रीड

2
<<<द्वारा बॉर्न दुनिया के लिए पेश किया गया था zsh, नहीं ksh। और यह यूनिक्स बंदरगाह में एक समान ऑपरेटर से प्रेरित था, rcजिसने उस अतिरिक्त न्यूलाइन चरित्र को नहीं जोड़ा। दिलचस्प =(<<<text)बात यह है कि ऑपरेटर उस न्यूलाइन को नहीं जोड़ता है zsh
स्टीफन चेज़लस

यदि आप इस उत्तर में रुचि के बारे में आश्चर्य करते हैं तो एसओ में इस प्रश्न के कारण है ।
फेडोरक्वि

1
क्या यहां कोई भी तरीका है जिससे यहां की स्ट्रिंग (बिना किसी अन्य उपयोगिता का उपयोग किए printf, जैसे आदि) में टेलिंग न्यूलाइन से बचा जा सकता है bash? @ StéphaneChazelas की तरह बताया गया है zsh
CTodea

3

एक ऐसा परिदृश्य जिसमें नई-नई रूपरेखाओं को यहाँ-वहाँ तार से जोड़ा जाना व्यावहारिक है, जब 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'

-3

मुझे लगता है कि यहां एक स्ट्रिंग के अंत में एक नई रूपरेखा प्राप्त करने का एकमात्र तरीका है, प्रमाण:

xxd <<<`echo -ne "a\n"`

ऐसा प्रतीत होता है कि जब तक वे आपके द्वारा प्रस्तुत सिंटैक्स में नहीं दिए जाते हैं, तब तक स्ट्रिंग-संचालक नई रूपरेखाएँ बनाते हैं।


4
यह कमांड प्रतिस्थापन है जो अंतिम न्यूलाइन को अलग कर रहा है। आप इसे सरल बना सकते हैं xxd <<<$(echo a)
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.