$ (कैट फ़ाइल) में bash remove \ n क्यों होता है?


24

अगर मेरे पास फाइल है input.txt:

hello
world
!

फिर बैश कमांड निष्पादित करने से echo $(cat input.txt)यह आउटपुट हो जाएगा:

hello world !

क्यों और कैसे मैं इसे ठीक करने के लिए आउटपुट कर सकता हूं कि फाइल में क्या है, फाइल में कैसे है?

जवाबों:


32

यदि तुम प्रयोग करते हो

echo "$(cat input.txt)"

यह सही ढंग से काम करेगा।

संभवतः इको का इनपुट नईलाइन्स द्वारा अलग किया गया है, और यह इसे अलग-अलग कमांड के रूप में हैंडल करेगा, इसलिए परिणाम बिना नईलाइन्स के होगा।


अच्छा! तो क्या अंतर है (यदि कोई है) $ () और बैकटिक्स के बीच? (क्षमा करें, यदि यह बहुत पेचीदा है)
चान-हो सुह

वे समान हैं, इस तथ्य को छोड़कर कि $ (...) घोंसला बनाना आसान है। दोनों मामलों में, यदि आप परिणाम को उद्धृत नहीं करते हैं तो यह सफेद स्थान पर कई तर्कों में टोकन होगा।
जेम्स हेनस्ट्रिज

3
लेकिन अंतिम न्यूलाइन वर्ण को छोड़ दिया जाता है, यहां तक ​​कि दोहरे उद्धरण चिह्नों में भी। इसके विपरीत, पर्ल के बैकटिक ऑपरेटर सभी नएलाइनों सहित कमांड के संपूर्ण आउटपुट तक फैलता है।
कीथ थॉम्पसन

6
@KeithThompson हाँ, कमांड प्रतिस्थापन आउटपुट से सभी अनुगामी न्यूलाइन्स को हटा देता है। इसका फायदा यह है कि echo "$(date) something"डेट के आउटपुट से ट्रेलिंग न्यूलाइन को हटा दिया जाता है, जिससे ईको आउटपुट डेट और उसी लाइन पर "कुछ" होता है। यदि आपको एक फ़ाइल या कमांड आउटपुट "जैसा है" स्टोर करने की आवश्यकता है, तो मैपफाइल ( help mapfile), read -rd ''या थोड़ी देर के रीड-लूप का उपयोग करें।
जिरह

सभी को धन्यवाद :-) मैंने यहाँ हर टिप्पणी से कुछ सीखा!
चान-हो सुह

2

बैश मैनुअल पेज से उद्धृत, अनुभाग Command Substitution:

एंबेडेड newlines हटाए नहीं जाते हैं, लेकिन शब्द विभाजन के दौरान उन्हें हटाया जा सकता है।

थोड़ा आगे, एक ही खंड:

यदि प्रतिस्थापन दोहरे कोट्स के भीतर दिखाई देता है, तो शब्द विभाजन और पथनाम विस्तार परिणामों पर नहीं किए जाते हैं।

इसलिए echo "$(cat /etc/passwd)" काम करता है।

इसके अतिरिक्त, किसी को पता होना चाहिए, कि POSIX विनिर्देशों द्वारा कमांड प्रतिस्थापन नए सिरे से अनुगामी हटाता है:

$ echo "$(printf "one\ntwo\n\n\n")"
one
two

इस प्रकार, एक फ़ाइल के माध्यम से आउटपुट $(cat file.txt)करने से नई अनुगामी का नुकसान हो सकता है, और यदि संपूर्ण फ़ाइल अखंडता प्राथमिकता है, तो यह एक समस्या हो सकती है।


2

उदाहरण के लिए, IFS को खाली करने के लिए, आप नई लिंक संरक्षित कर सकते हैं:

$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.