इको-ई के बीच अंतर "<string>" और गूंज $ "<string>"


20

उपयोग करने के बीच की विकृति क्या है

echo -e "Hello\nWorld" 

तथा

echo $"Hello\nWorld" 

क्या वे दोनों उत्पादन नहीं करते हैं:

Hello
World

1
क्या तुमने कोशिश की? दूसरा एक आउटपुट Hello\nWorld। आपको -eभागने वाले पात्रों की व्याख्या करने के लिए स्विच की आवश्यकता है ।
बेको

4
दूसरे एक के लिए, मुझे संदेह है कि आप इसे सिंगल कोट्स के साथ लिखने के लिए थे echo $'Hello\nWorld', जो कि बैश के नीचे दो लाइनों पर प्रिंट होगा।
जॉन 1024

@becko, हाँ मैंने इसे आज़माया और वे दोनों एक ही सटीक चीज़ का उत्पादन करते हैं।
मार्क

जवाबों:


33

echo -eऔर echo $'...'दोनों समान हैं कि वे निम्नलिखित एस्केप दृश्यों का समर्थन करते हैं:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

उनमें मतभेद हैं। उपरोक्त के अलावा, echo -eसमर्थन करता है:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

इसके विपरीत, $'....'समर्थन करता है:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

निरीक्षण करें कि, दोनों के बीच, \cएक्सटेंशन असंगत हैं:

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

के लिए echo -eऊपर, \cआगे उत्पादन को दबा, जिससे अनदेखी Istop। इसके विपरीत, के लिए $'...', \cIएक टैब के रूप में व्याख्या की जाती है।

नेत्रहीन समान रूप: $"..."

इसके विपरीत $'...', का कार्य $"..."काफी भिन्न होता है। यह वर्तमान लोकेल के अनुसार अनुवादित होने वाले स्ट्रिंग का कारण होगा।

echo -eविवाद

echo -eसार्वभौमिक रूप से गोले द्वारा समर्थित नहीं है और कई -eएक डिजाइन गलती के रूप में विकल्प का संबंध है। का निरीक्षण करें:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

जैसा कि आप देख सकते हैं, अगर आप जो प्रिंट कर रहे हैं echoवह डैश के साथ शुरू होता है, तो परिणाम अप्रत्याशित हो सकते हैं। जब तक आप सुनिश्चित नहीं होते कि आप जिस पहले स्ट्रिंग के साथ प्रिंट करेंगे echoवह डैश से शुरू नहीं होती है, तो आप उपयोग करने से बेहतर हो सकते हैं printf

इन कारणों के लिए, POSIX मानक समाप्त होता है :

नए अनुप्रयोगों को इको के बजाय प्रिंटफ का उपयोग करने के लिए प्रोत्साहित किया जाता है।

चेत रमी, जिन्होंने bashपिछले 22 वर्षों से बनाए रखा है , सहमत हैं :

[एन] ईडब्ल्यू कोड को प्रिंटफ का उपयोग करना चाहिए।


1
यह भी ध्यान देने योग्य है कि Chet और POSIX दोनों का उपयोग printfकरने की सलाह देते हैंecho
geirha

@geirha बहुत अच्छे अंक। उत्तर अपडेट किया गया।
7:10 पर जॉन 1024

1
ग्लब्स (जैसे *) से अप्रत्याशित विकल्पों की समस्या वास्तव में विशिष्ट नहीं है echo। यह किसी भी कमांड के साथ होता है जो छोटे या लंबे विकल्प (पारंपरिक तरीके से लिखे गए) को पहचानता है और इसमेंls फाइलनाम ऑपरेंड्स भी शामिल है । तर्क के बाद से स्थिति थोड़ी खराब echoहै (जैसा कि आपके स्रोत का उल्लेख है) echoआमतौर पर --विकल्पों के अंत को इंगित करने के लिए स्वीकार नहीं करता है , जबकि कोई भी आदेश लिख सकता है ls -- *l। (और वास्तव में एक को आमतौर पर उस तरह से कमांड लिखने की ज़रूरत होती है, जब ग्लब्स का उपयोग करना शुरू होता है *या -विशेष रूप से लिपियों में।)
एलियाह कगन

पूरी तरह से उत्तर के लिए धन्यवाद, मैं निश्चित रूप से मेरी आपरेटिंग सिस्टम के लिए एक अभ्यास है और मैं का उपयोग कर कुछ पाठ मुद्रित करने के लिए आवश्यक \nएस्केप अनुक्रम है, तो वास्तव में यह बात अगर मैं का उपयोग नहीं करता है echo -e '...', echo $'...'याecho $"..."
मार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.