शेल स्क्रिप्ट में 'इको' बिना न्यूलाइन के


540

मुझे echoअपनी स्क्रिप्ट में समस्या है :

echo -n "Some string..."

प्रिंट

-n Some string...

और अगली पंक्ति में जाता है। कंसोल में यह बिना newline के काम कर रहा है:

Some string...

2
आप किस बोर्न शेल कार्यान्वयन का उपयोग कर रहे हैं? अगर मैं bashबोर्न शेल मोड में चलता हूं , तो यह यहां ठीक काम करता है। इसके अलावा, यह कुछ हद तक संभावना नहीं है कि आप वास्तव में अपने इंटरैक्टिव शेल के रूप में एक बोर्न शेल का उपयोग कर रहे हैं, नहीं?
फेटलुर्र

4
उबंटू पर:echo -ne "text without new line: "; echo "some text";
zsoltii

मुझे पता है कि यह बहुत पुराना है, लेकिन यह मेरे लिए विंडोज 10 में काम करता है, एक नई पंक्ति के बिना अवधि जोड़ने के लिए: इको | सेट / पी = ""
SPlatten

जवाबों:


572

echoविभिन्न व्यवहारों के साथ कमांड के कई संस्करण हैं। जाहिरा तौर पर आपकी स्क्रिप्ट के लिए उपयोग किया गया शेल एक ऐसे संस्करण का उपयोग करता है जो पहचान नहीं करता है -n

printfआदेश और अधिक संगत व्यवहार है। echoसाधारण चीजों के लिए ठीक है echo hello, लेकिन मैं सुझाव देता हूं कि printfकिसी भी चीज का अधिक जटिल उपयोग करें ।

आप किस सिस्टम पर हैं, और आपकी स्क्रिप्ट किस शेल का उपयोग करती है?


46
लाइन के साथ शुरू करके #!/bin/bashयह काम किया। आम तौर पर मैं बैश के साथ काम कर रहा हूं।
qwertz

मेरी इच्छा है कि सीएमडी में एक विंडोज समतुल्य था :( जहाँ तक मैं देख सकता हूँ, एक ही व्यवहार को प्राप्त करने के लिए सिर्फ वर्कअराउंड नहीं है।
kayleeFrye_onDeck

2
@kayleeFrye_onDeck: शायद printfकमांड का विंडोज संस्करण है ।
कीथ थॉम्पसन

मैं चाहता हूँ। echoहमेशा newlines जोड़ता है ... वर्कअराउंड सबसे अच्छा है।
kayleeFrye_onDeck

2
@alper %आपका शेल प्रॉम्प्ट है। यह कोशिश करो, और ध्यान से देखो:printf hello; sleep 5
कीथ थॉम्पसन

150

bash एक "अंतर्निहित" कमांड है जिसे "इको" कहा जाता है:

$ type echo
echo is a shell builtin

इसके अतिरिक्त, एक "इको" कमांड है जो एक उचित निष्पादन योग्य है (जो कि शेल फॉर्क्स और निष्पादित करता है /bin/echo, जैसा कि इसे व्याख्या करने echoऔर निष्पादित करने का विरोध किया गया है):

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

या तो echoWRT का व्यवहार \cऔर -nभिन्न होता है। आपका सबसे अच्छा दांव उपयोग करना है printf, जो चार अलग-अलग * NIX फ्लेवर पर उपलब्ध है जो मैंने देखा:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
गहराई से उत्तर में बड़े पैमाने पर धन्यवाद!
डार्थ एलीगसिव

91

के साथ प्रयास करें

echo -e "Some string...\c"

यह मेरे लिए उम्मीद के मुताबिक काम करता है (जैसा कि मैंने आपके प्रश्न से समझा था)।

ध्यान दें कि मुझे यह जानकारी manपृष्ठ से मिली है । manपेज भी नोट खोल का अपना संस्करण हो सकता है echo, और मुझे यकीन है कि अगर नहीं कर रहा हूँ bashअपने स्वयं के संस्करण है।


+1 मुझे सही दिशा में संकेत करने के लिए, हालाँकि जो कि पहचान नहीं करता है -एक विकल्प शायद पहचानता नहीं है (-और न ही) विकल्प या तो आप शायद केवल echo "some string...\c"इसके बजाय कहना चाहते हैं । यदि आपको बेतहाशा अलग-अलग गूंज वाले कमांड के साथ कई बैश वेरिएंट का समर्थन करने की आवश्यकता है, तो आप शायद प्रिंटफ का उपयोग करने के लिए बेहतर हैं या आपको इको कमांड की क्षमताओं को कुछ इस तरह से चेक करना होगा [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(कम से कम बैश सपोर्ट \ सी के रूप में अच्छी तरह से, इसलिए उपयोग करने की आवश्यकता नहीं है -एन विकल्प, लेकिन आपको बैश के लिए -ई चाहिए)
टिमो

मेरे लिए, यह बिल्कुल वही करता है जो ओपी के मामले में करता है: आउटपुट शाब्दिक -e। मुझे लगता है कि
प्रिंटफ

-वह एक पॉज़िक्स शेल स्क्रिप्ट में काम नहीं करेगा, यह स्क्रीन के बजाय आउटपुट होगा।
थॉमस डिगन

7

इसे प्राप्त करने के लिए मूल रूप से दो विधियाँ हैं जिनका मैं अक्सर उपयोग करता हूं:

1. कर्सर भागने चरित्र ( \c) के साथ का उपयोग करनाecho -e

उदाहरण :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eध्वज स्ट्रिंग में E स्कैप वर्णों को सक्षम करता है ।
  • \cC ursor को वर्तमान लाइन पर वापस लाता है ।

या

2.printf कमांड का उपयोग करना

उदाहरण :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3

यदि आप अन्य कमांड के साथ इको का उपयोग करते हैं, जैसे "रीड", तो यह सेटिंग को अनदेखा कर सकता है और यह किसी भी तरह एक नई लाइन पर जा सकता है।


2

बस सबसे लोकप्रिय लिनक्स के लिए Ubuntu और यह है bash:

  1. जांचें कि आप किस शेल का उपयोग कर रहे हैं? ज्यादातर नीचे काम करता है, और इसे देखें :

    echo $0

  2. यदि ऊपर प्रिंट होता है bash, तो नीचे काम करेगा:

    printf "hello with no new line printed at end"
    या
    echo -n "hello with no new line printed at end"


1

मुझे विश्वास है कि अभी आपका आउटपुट प्रिंटिंग नीचे की तरह है

~ echo -e "String1\nString2"
String1
String2

आप xargsएक ही लाइन में मल्टीलाइन स्टडआउट प्राप्त करने के लिए उपयोग कर सकते हैं ।

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

जब आप जाते हैं और लिखते हैं तो शेल स्क्रिप्ट हमेशा #! / Usr / bin / env बैश के रूप में पहली पंक्ति में आती है। यह शेल एस्केप सिक्वेंस को छोड़ या हेरफेर नहीं करता है। पूर्व प्रतिध्वनि "यह पहली \ n पंक्ति है" प्रिंट यह पहली \ n पंक्ति है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.