Perché l'eco non supporta "\ e" (escape) quando si utilizza l'argomento -e in MacOSX


36

Quando provo a stampare del testo colorato usando le sequenze di escape ANSI tramite il echocomando integrato , sembra che la \esequenza di escape nella stringa che fornisco sia interpretata letteralmente invece che come "escape" che dovrebbe rappresentare. Questo succede solo in Snow Leopard: gli esempi seguenti funzionano come previsto in Leopard.

Apparentemente echosupporta lo -eswitch poiché interpreta correttamente \nquando lo si utilizza:

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


~ $ 

Ma quando provo ad usare \e, ottengo questo:

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

Come ho detto, in Leopard, quanto sopra mi darebbe la stringa "COLORI" di colore.

Qualcuno sa un motivo per cui questo potrebbe essere un cambiamento previsto? Che ne dici di una soluzione alternativa per stampare sequenze di escape ANSI dagli script Bash su Snow Leopard?

La versione della shell Bash sulla mia macchina Leopard è 3.2.17(1)-releasee 3.2.48(1)-releasesulla mia macchina Snow Leopard.


1
La domanda contraddice il post. Nella domanda ti riferisci a / bin / echo, mentre nel post usi echo senza percorso, che molto probabilmente è l'eco incorporata della tua shell.
0x89,

Certo, grazie per averlo notato. Ho risolto la domanda per riflettere questo.
Hasseg,

Risposte:


24

Non posso dirti perché non supporta tale argomento (potrebbe essere necessario chiedere ai programmatori a tale proposito). So solo che sul mio Linux box ottengo questo:

$ /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/>
  • questo non menziona le \efughe
  • dice che /bin/echoproviene da gnu coreutils. Man mano che Apple cambia la fonte dei loro componenti del sistema unix di volta in volta (ad esempio, passa da zsh a bash), controlla se c'è stato un cambio /bin/echotra Leopard e Snow Leopard. Se è gnu, puoi chiedere alle persone su gnu.org perché scelgono di non includere quelle sequenze.

Per quanto riguarda le soluzioni alternative (è più interessante): non si usa /bin/echo, ma il builtin di bash echofunziona su Linux box. Se cambiassero in bash senza eco incorporato (o qualcosa di ancora più oscuro), potresti anche provare questa caratteristica non molto nota della tua shell (funziona almeno in bash e zsh):

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

Questa è la parte corrispondente della manpage di bash:

   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
Non ero consapevole di $'string'essere abilitato alla sequenza di escape, grazie.
Hasseg,

1
\enon fa parte dello standard POSIX; l'implementazione dei coreutils GNU è stata estesa allo standard. OS X no.
Martijn Pieters,


15

Funziona \033ancora? Altrimenti, puoi premere Ctrl + V seguito dal tasto Esc (se un mac ha quei tasti) per creare un vero carattere di controllo all'interno della riga di comando (che ovviamente non funziona così bene negli script, a seconda dell'editor)


5
\033invece di \efunzionare, grazie.
Hasseg,

4
Solo per riferimento, 33è il valore ottale del personaggio Escape .
TachyonVortex,

Solo per riferimento futuro lettore 033sarebbe standardizzato modo di scrivere ottale.
ocodo,

11

Un altro modo di stampare sequenze di escape ANSI nella shell è usare /usr/bin/printf.


3
printf è il modo portatile di visualizzare le cose nella shell. Ci sono troppi sapori di eco ...
mouviciel,

6

Per integrare la risposta utile esistente con alcune informazioni di base :

Se stai invocando solo echoper nome - a differenza del suo percorso, /bin/echo- stai invocando l' integrato di Bash anziché l'utilità esterna.

Il comportamento di elementi nativi di Bash come i builtin è in genere portatile in un senso di Bash, il che significa che dovrebbero funzionare allo stesso modo su qualsiasi piattaforma in grado di eseguire Bash .

\eè una curiosa eccezione che riguarda le versioni 3.x Bash di macOS (fino ad oggi, a partire dalla v10.13.5 (High Sierra), macOS viene fornito con versioni 3.x obsolete di Bash, per motivi legali).

\e(e il suo alias \E) dovrebbe funzionare con echo -e; \eil supporto è stato aggiunto al echobuilt-in in Bash 2.0 . , ma inspiegabilmente no nella versione 3.x di serie su macOS.

\e fa il lavoro in 3.x versioni Bash su altre piattaforme, come MSYS su Windows.

Al contrario, se si installa e si utilizza un 4.x Bash su MacOS, \e fa il lavoro.


2

Potrebbero provare a conformarsi a POSIX: http://www.opengroup.org/onlinepubs/9699919799/

La parte OPTIONS afferma tra l'altro:

Implementations shall not support any options.

Ecco il link diretto al materiale che penso tu intendessi: opengroup.org/onlinepubs/9699919799/utilities/echo.html
In pausa fino a nuovo avviso.

No. La pagina continua a scrivere: "Se il primo operando è -n o se uno degli operandi contiene un carattere <barra rovesciata>, i risultati sono definiti dall'implementazione." Inoltre, l'eco macOS interpreta -e.
Yongwei Wu,

2

Cordiali saluti, Stiamo per aggiungere il supporto \ e a / bin / echo e / usr / bin / printf in coreutils. Nota che gli standard C non specificano \ e, ma gcc, perl, bash, ksh e tcsh lo supportano


0

È possibile verificare se ,, escape caratteri non ascii '' sono stati deselezionati nel menu delle opzioni di visualizzazione di terminal.app.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.