कमांड "इको" में एक फ़ाइल की सामग्री को पुनर्निर्देशित करना


41

मेरे पास एक फाइल है, my_file.txtजिसका कंटेंट सिर्फ स्ट्रिंग है Hello। मैं इसकी सामग्री को कमांड पर कैसे पुनर्निर्देशित कर सकता हूं echo?

मैं जानता हूँ कि मैं आदेशों है less, cat, more... लेकिन मैं इसके साथ क्या करने की जरूरत echo

मैंने यह कोशिश की:

$ cat my_file.txt | echo

और यह भी:

$ echo < my_file.txt

लेकिन दोनों ही मामलों में यह stdout में केवल एक रिक्त प्रतीत होता है, my_file.txt की सामग्री नहीं।

ऐसा कैसे किया जा सकता था?


7
आप उपयोग करने पर जोर क्यों देते हैं echo?
केविन

7
@ केविन, संभवतः अंततः वह फ़ाइल में एएनएसआई सी एस्केप सीक्वेंस ( ... \n, b) का विस्तार करना चाहता है , जो echo(कम से कम एक मानक echo) का एक वैध उपयोग होगा । या शायद वह समझना चाहता है कि यह उस तरह से काम क्यों नहीं करता है। किसी भी मामले में, IMO को कम करने का कोई कारण नहीं।
स्टीफन चेज़लस

3
मैं यहां इसलिए आया क्योंकि मैं उत्सुक था कि जब मैं गूंजता हूं तो यह काम क्यों नहीं करता है <file.txt। एसई पर एक उचित प्रश्न लगता है, उत्तर बहुत मददगार था। मुझ से +1।
न्यूरॉन

जवाबों:


53

आप उन सभी को पुनर्निर्देशित कर सकते हैं जो आप चाहते हैं, echoलेकिन यह इसके साथ कुछ नहीं करेगा। echoइसके मानक इनपुट को नहीं पढ़ता है। यह सब मानक उत्पादन के लिए एक अंतरिक्ष चरित्र द्वारा अलग किए गए अपने तर्कों को लिखता है और एक नई लाइन वर्ण द्वारा समाप्त होता है (और कुछ echoकार्यान्वयन के साथ उनमें से कुछ एस्केप अनुक्रमों का विस्तार और / या तर्कों को -संभवतः विकल्पों के रूप में माना जाता है) के साथ शुरू होता है ।

यदि आप echoकिसी फ़ाइल की सामग्री प्रदर्शित करना चाहते हैं , तो आपको उस सामग्री को एक तर्क के रूप में पास करना होगा echo। कुछ इस तरह:

echo "$(cat my_file.txt)"

ध्यान दें कि $(...)अनुगामी न्यू लाइन चरित्र स्ट्रिप्स रों कि के उत्पादन से catआदेश है, और echoकहते हैं एक वापस।

यह भी ध्यान दें कि इसके अलावा zsh, आप NUL वर्णों को कमांड के तर्कों में पारित नहीं कर सकते हैं, ताकि ऊपर बाइनरी फ़ाइलों के साथ आम तौर पर काम न करें। yashउन बाइट्स को भी हटा देगा जो मान्य वर्णों का हिस्सा नहीं हैं।

अगर ऐसा करना चाहते के लिए कारण यह है कि आप चाहते हैं echoविस्तार करने के लिए \n, \b, \0351... फ़ाइल में भागने दृश्यों (यूनिक्स अनुरूप के रूप में echoकार्यान्वयन करते हैं, लेकिन सभी नहीं ), तो आप इसके बजाय का उपयोग करें printfके बजाय :

printf '%b\n' "$(cat my_file.txt)"

के विपरीत echo, कि एक पोर्टेबल है और समस्या नहीं होगी अगर फ़ाइल की सामग्री के साथ शुरू होता है -


करने के लिए एक विकल्प के रूप $(cat file), के साथ ksh, zshऔर bash, एक भी कर सकते हैं: $(<file)। यह एक विशेष ऑपरेटर है, जिसके अनुसार शेलcat विस्तार करने के लिए फ़ाइल की सामग्री को पढ़ने के लिए विरोध करता है। यह अभी भी NUL बाइट्स को छोड़कर, अनुगामी newlines स्ट्रिप्स और चुटकी लेती है zsh। में bash, वह अभी भी एक अतिरिक्त प्रक्रिया की मांग करता है। यह भी ध्यान दें कि एक अंतर यह है कि इस तरह की डायरेक्टरी की फाइल पढ़ने की कोशिश करने पर आपको कोई त्रुटि नहीं होगी। इसके अलावा, जबकि $(< file)विशेष है, अन्य शेल का अनुकरण नहीं कर रहा है $(< file; other command)( zshजब, अभी भी की सामग्री का विस्तार होगा file, निहित $READNULLCMD आदेश (आमतौर पर पेजर) चलाकर ।


3
दोनों बाश और zsh में आप को छोड़ सकते हैं catऔर सिर्फ खोल इसे सीधे में पढ़ा है echo "$(<my_file.txt)":।
केविन

1
हाँ, ksh , zsh और bash के साथ आप उपयोग कर सकते हैं $(<filename)
दीमिट्रे रादोलोव

बहुत बहुत धन्यवाद, कि मुझे क्या चाहिए और यह काम किया! :-)
danielmbcn

@ केविन, दिमित्रे, अब जोड़ा।
स्टीफन चेज़लस

4

अन्य उत्तरों में जोड़कर, आप इसके बजाय इनपुट पुनर्निर्देशन भी आज़मा सकते हैं cat

echo $(<my_file.txt)

या

echo `<my_file.txt`

$()और `` एक ही बात करते हैं, वे अपने दायरे के अंदर कमांड चलाते हैं और शेल को आउटपुट देते हैं जैसे कि यह उपयोगकर्ता द्वारा इनपुट के रूप में दिया गया था। इन दोनों के बीच एकमात्र अंतर यह है कि $ () पुनरावर्ती हो सकता है और `` पुनरावर्ती नहीं हो सकता।


2

सरल उत्तर: आप नहीं कर सकते। echo(यह शेल निर्मित या नियमित बाइनरी है) इसके मानक इनपुट को संसाधित नहीं करता है - यह केवल एक ही तरीका है।


सवाल यह है कि आप वास्तव में ऐसा क्यों करना चाहेंगे?
पीटरफ

2

जैसा कि कहा गया था,

यदि आप echoकिसी फ़ाइल की सामग्री प्रदर्शित करना चाहते हैं , तो आपको उस सामग्री को एक तर्क के रूप में पास करना होगाecho

उदाहरण के लिए, आप इसे इस तरह से कर सकते हैं xargs( यह मानते हुए कि आपको बैकस्लैश एस्केप की व्याख्या को सक्षम करने की आवश्यकता है ):

$ cat my_file.txt | xargs echo -e

या बस आपने क्या पूछा है ( बच अनुक्रमों की पूरी व्याख्या ):

$ cat my_file.txt | xargs echo

ध्यान दें कि जब उपयोग किया जाता है xargs echo( डिफ़ॉल्ट रूप में xargsbtw के रूप echoमें ही ), यह echoफाइल सिस्टम से कमांड है जिसे चलाया जाएगा, शेल की बिल्ट echoकमांड नहीं। यह भी ध्यान दें कि xargsइसके इनपुट की अपेक्षा एक बहुत ही विशिष्ट प्रारूप में की जाती है (जहाँ रिक्त स्थान, नई सूचियाँ, उद्धरण, बैकस्लैश का विशेष अर्थ होता है)। catयहाँ कोई मतलब नहीं है क्योंकि वहाँ केवल एक फ़ाइल को समरूप करने के लिए है (उसी के रूप में < file.txt xargs echo। ध्यान दें कि यूनिक्स अनुरूप echos डिफ़ॉल्ट और आउटपुट -eपर बैकस्लैश से बचने के विस्तार को echo -e
बढ़ाते हैं

0

बैश में, निम्नलिखित को भी काम करना चाहिए:

echo `cat my_file.txt`

बैकटिक्स में भाग को उस कमांड के आउटपुट से बदल दिया जाता है, अर्थात इस मामले में फ़ाइल सामग्री द्वारा प्रतिस्थापित किया जाता है।


सच है, backticks की तरह काम करते हैं $( . . . )। जो लोग $()आमतौर पर उपयोग करते हैं वे उन्हें पसंद करते हैं क्योंकि आप उन्हें घोंसला बना सकते हैं। यह सवाल पुराना है, हालांकि, यह उन सवालों के जवाब देने के लिए बहुत अधिक संतोषजनक है जो पहले से ही उत्तर नहीं हैं!
कानून

काफी नहीं। सूक्ष्म अंतर है। जब बैक-टिक फ़ॉर्म का उपयोग किया जाता है, तो एक बैकस्लैश इसके शाब्दिक अर्थ को बनाए रखता है, जब $, `, या \ के बाद। बैकस्लैश के पहले बैक-टिक नहीं कमांड को समाप्त करता है। $ (,,) फॉर्म का उपयोग करते समय, कोष्ठक के बीच के सभी अक्षर कमांड बनाते हैं।
fpmurphy

जैसा कि कमांड प्रतिस्थापन का हवाला नहीं दिया गया है, विभाजन + ग्लोब ऑपरेटर इसे लागू किया जाएगा। उदाहरण के लिए, यदि ऐसा my_file.txtहै *, तो वर्तमान निर्देशिका में फ़ाइल नामों की सूची को प्रिंट किया जाएगा।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.