अगर मेरे पास फाइल है input.txt
:
hello
world
!
फिर बैश कमांड निष्पादित करने से echo $(cat input.txt)
यह आउटपुट हो जाएगा:
hello world !
क्यों और कैसे मैं इसे ठीक करने के लिए आउटपुट कर सकता हूं कि फाइल में क्या है, फाइल में कैसे है?
अगर मेरे पास फाइल है input.txt
:
hello
world
!
फिर बैश कमांड निष्पादित करने से echo $(cat input.txt)
यह आउटपुट हो जाएगा:
hello world !
क्यों और कैसे मैं इसे ठीक करने के लिए आउटपुट कर सकता हूं कि फाइल में क्या है, फाइल में कैसे है?
जवाबों:
यदि तुम प्रयोग करते हो
echo "$(cat input.txt)"
यह सही ढंग से काम करेगा।
संभवतः इको का इनपुट नईलाइन्स द्वारा अलग किया गया है, और यह इसे अलग-अलग कमांड के रूप में हैंडल करेगा, इसलिए परिणाम बिना नईलाइन्स के होगा।
echo "$(date) something"
डेट के आउटपुट से ट्रेलिंग न्यूलाइन को हटा दिया जाता है, जिससे ईको आउटपुट डेट और उसी लाइन पर "कुछ" होता है। यदि आपको एक फ़ाइल या कमांड आउटपुट "जैसा है" स्टोर करने की आवश्यकता है, तो मैपफाइल ( help mapfile
), read -rd ''
या थोड़ी देर के रीड-लूप का उपयोग करें।
बैश मैनुअल पेज से उद्धृत, अनुभाग Command Substitution
:
एंबेडेड newlines हटाए नहीं जाते हैं, लेकिन शब्द विभाजन के दौरान उन्हें हटाया जा सकता है।
थोड़ा आगे, एक ही खंड:
यदि प्रतिस्थापन दोहरे कोट्स के भीतर दिखाई देता है, तो शब्द विभाजन और पथनाम विस्तार परिणामों पर नहीं किए जाते हैं।
इसलिए echo "$(cat /etc/passwd)"
काम करता है।
इसके अतिरिक्त, किसी को पता होना चाहिए, कि POSIX विनिर्देशों द्वारा कमांड प्रतिस्थापन नए सिरे से अनुगामी हटाता है:
$ echo "$(printf "one\ntwo\n\n\n")"
one
two
इस प्रकार, एक फ़ाइल के माध्यम से आउटपुट $(cat file.txt)
करने से नई अनुगामी का नुकसान हो सकता है, और यदि संपूर्ण फ़ाइल अखंडता प्राथमिकता है, तो यह एक समस्या हो सकती है।
उदाहरण के लिए, IFS को खाली करने के लिए, आप नई लिंक संरक्षित कर सकते हैं:
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3