MacOSX में -e तर्क का उपयोग करते समय ईको "एस्केप" (भागने) का समर्थन क्यों नहीं करता है


36

जब मैं निर्मित echoकमांड के माध्यम से एएनएसआई से बचने के दृश्यों का उपयोग करके कुछ रंगीन पाठ को प्रिंट करने की कोशिश करता हूं , तो ऐसा लगता है कि \eजो स्ट्रिंग मैं प्रदान करता हूं उसमें एस्केप अनुक्रम का शाब्दिक अर्थ है "एस्केप" के बजाय इसका प्रतिनिधित्व करना। यह केवल स्नो लेपर्ड में होता है - नीचे दिए गए उदाहरण तेंदुए के अनुसार काम करते हैं।

स्पष्ट रूप echoसे -eस्विच का समर्थन करता है क्योंकि यह इसका \nउपयोग करते समय सही ढंग से व्याख्या करता है:

~ $ 
~ $ echo "\n"
\n
~ $ echo -e "\n"


~ $ 

लेकिन जब मैं उपयोग करने की कोशिश करता \eहूं, तो मुझे यह मिलता है:

~ $ echo -e "\e[34mCOLORS"
\e[34mCOLORS
~ $ 

जैसा कि मैंने कहा, तेंदुए में, ऊपर मुझे रंग में स्ट्रिंग "रंग" देगा।

क्या किसी को इसका कारण पता है कि यह एक बदलाव क्यों हो सकता है? हिम तेंदुए पर बैश लिपियों से एएनएसआई से बचने के दृश्यों को प्रिंट करने के लिए वर्कअराउंड के बारे में कैसे?

मेरी तेंदुए मशीन पर बैश शेल संस्करण है 3.2.17(1)-releaseऔर 3.2.48(1)-releaseमेरे हिम तेंदुए की मशीन पर।


1
प्रश्न पोस्ट का खंडन करता है। प्रश्न में आप / बिन / प्रतिध्वनि का उल्लेख करते हैं, जबकि पोस्ट में आप पथ के बिना प्रतिध्वनि का उपयोग करते हैं, जो संभवतः आपके शेल का बिल्ट इको है।
0x89

बेशक - ध्यान देने के लिए धन्यवाद। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न तय किया।
hasseg

जवाबों:


24

मैं आपको यह नहीं बता सकता कि यह उस तर्क का समर्थन क्यों नहीं करता है (आपको प्रोग्रामर को उस बारे में पूछना पड़ सकता है)। मुझे केवल इतना पता है कि मेरे लिनक्स बॉक्स पर, मुझे यह मिलता है:

$ /bin/echo --help
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
  or:  /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.

  -n             do not output the trailing newline
  -e             enable interpretation of backslash escapes
  -E             disable interpretation of backslash escapes (default)
      --help     display this help and exit
      --version  output version information and exit

If -e is in effect, the following sequences are recognized:
*emphasized text*
  \0NNN   the character whose ASCII code is NNN (octal)
  \\     backslash
  \a     alert (BEL)
  \b     backspace
  \c     produce no further output
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab

NOTE: your shell may have its own version of echo, which usually supersedes
the version described here.  Please refer to your shell's documentation
for details about the options it supports.

Report echo bugs to bug-coreutils@gnu.org
GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
Report echo translation bugs to <http://translationproject.org/team/>
  • इसमें \eपलायन का उल्लेख नहीं है
  • यह कहता है कि यह /bin/echoग्नू कोरुटिल्स से है। जैसा कि सेब समय-समय पर अपने यूनिक्स-सिस्टम घटकों के स्रोत को बदलता है (उदाहरण के लिए ज़ीश से बैश तक), अगर /bin/echoतेंदुए और हिम तेंदुए के बीच कोई परिवर्तन हुआ था, तो जांचें । यदि यह gnu है, तो आप gnu.org पर लोगों से पूछ सकते हैं कि वे उन अनुक्रमों को शामिल क्यों नहीं करना चाहते हैं।

के रूप में workarounds के लिए (अधिक दिलचस्प है): उपयोग नहीं कर रहा है /bin/echo, लेकिन बैश के बेसिन echoलिनक्स बक्से पर काम करता है। यदि वे बिना बेसिन प्रतिध्वनि (या कुछ और अधिक अस्पष्ट) के बिना एक बैश में बदल गए, तो आप अपने शेल की व्यापक रूप से ज्ञात विशेषता (कम से कम बाश और zsh में काम करता है) को भी आज़मा सकते हैं:

$ echo $'\e[34m''COLORS'

यह बैश के मुख्यपृष्ठ का मिलान भाग है:

   Words  of  the  form  $'string' are treated specially.  The word expands to string, with
   backslash-escaped characters replaced as specified by the ANSI  C  standard.   Backslash
   escape sequences, if present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the  eight-bit  character whose value is the octal value nnn (one to three
                 digits)
          \xHH   the eight-bit character whose value is the hexadecimal value  HH  (one  or
                 two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the dollar sign had not been present.

   A  double-quoted string preceded by a dollar sign ($) will cause the string to be trans
   lated according to the current locale.  If the current locale is C or POSIX, the  dollar
   sign  is  ignored.  If the string is translated and replaced, the replacement is double-
   quoted.

4
मैं $'string'भागने अनुक्रम होने के बारे में पता नहीं था , धन्यवाद, धन्यवाद।
सेसेप

1
\ePOSIX मानक का हिस्सा नहीं है; GNU कोरुटिल्स कार्यान्वयन मानक पर विस्तारित हुआ। OS X नहीं किया।
मार्टिज़न पीटरर्स


15

\033अभी भी काम करता है ? यदि नहीं, तो आप उम्मीद कर सकते हैं कि कमांड लाइन के अंदर एक वास्तविक नियंत्रण चरित्र बनाने के लिए एस्केप कुंजी (यदि एक मैक उन कुंजी है) के बाद Ctrl + V दबाएं (जो कि संपादक के आधार पर पाठ्यक्रम की स्क्रिप्ट में अच्छी तरह से काम नहीं करता है)


5
\033इसके बजाय \eकाम करता है, धन्यवाद।
सेसेप

4
बस संदर्भ के लिए, एस्केप चरित्र33 का अष्टक मूल्य है ।
TachyonVortex

बस भविष्य के पाठक संदर्भ के लिए अष्टक लिखने का मानकीकृत तरीका 033होगा ।
ओसोडो

11

शेल में ANSI एस्केप सीक्वेंस को प्रिंट करने का एक और तरीका है /usr/bin/printf


3
Printf शेल में चीजों को प्रदर्शित करने का पोर्टेबल तरीका है। गूंज के बहुत सारे फ्लेवर हैं ...
mouviciel

6

कुछ पृष्ठभूमि जानकारी के साथ मौजूदा सहायक उत्तर को पूरक करने के लिए :

यदि आप कर रहे हैं प्रेरक echoद्वारा नाम केवल - के रूप में अपने रास्ते के साथ करने का विरोध किया, /bin/echo- आप बैश लागू कर रहे हैं निर्मित नहीं बल्कि बाहरी उपयोगिता की तुलना में।

मूल बश तत्वों जैसे कि बिलीन्स का व्यवहार आम तौर पर बैश अर्थ में पोर्टेबल होता है, जिसका अर्थ है कि उन्हें बैश चलाने में सक्षम किसी भी मंच पर समान काम करना चाहिए

\eएक उत्सुक अपवाद है जो macOS पर 3.x बैश संस्करणों को प्रभावित करता है (आज तक, v10.13.5 (उच्च सिएरा) के रूप में, macOS कानूनी कारणों से, बैश के पुराने 3.x संस्करणों के साथ आता है)।

\e(और इसके उपनाम \E) के साथ काम करना चाहिएecho -e ; \eसमर्थन को बैश 2.0echo में बिलिन में जोड़ा गया था । , लेकिन अनावश्यक रूप से macOS पर 3.x स्टॉक संस्करण में नहीं है।

\e अन्य प्लेटफार्मों पर 3.x बैश संस्करणों में काम करता है, जैसे कि विंडोज पर MSYS।

इसके विपरीत, यदि आप मैकओएस पर एक 4.x बैश स्थापित और उपयोग करते हैं , \e तो काम करता है


2

वे POSIX के अनुरूप होने की कोशिश कर सकते हैं: http://www.opengroup.org/onlinepubs/9699919799/

भाग विकल्प अन्य बातों के अलावा:

Implementations shall not support any options.

यहां उस सामग्री का सीधा लिंक दिया गया है जो मुझे लगता है कि आपका इरादा है: opengroup.org/onlinepubs/9699919799/utilities/echo.html
आगे की सूचना तक रोका गया।

नहीं। पृष्ठ लिखना जारी रखता है: 'यदि पहला ऑपरेंड -n है, या यदि किसी ऑपरेंड में कोई <बैकस्लैश> वर्ण है, तो परिणाम कार्यान्वयन-परिभाषित होते हैं।' इसके अलावा, macOS गूंज व्याख्या करता है -e
योंगवेई वू जूल

2

FYI करें, हम बस के बारे में / बिन / प्रतिध्वनि और / usr / bin / printf को coreutils में जोड़ने जा रहे हैं। ध्यान दें कि C मानक \ e निर्दिष्ट नहीं करते हैं, लेकिन gcc, perl, bash, ksh और tcsh इसका समर्थन करते हैं


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