Почему эхо не поддерживает “\\e” (Escape) при использовании-e аргумента в MacOSX

Когда я пытаюсь распечатать некоторый цветной текст с помощью escape-последовательностей ANSI через встроенное echo команда, кажется что \e escape-последовательность в строке, которую я обеспечиваю, интерпретируется буквально вместо как "Escape", который она, как предполагается, представляет. Это только происходит в Snow Leopard - примеры ниже работы, как предназначено в Leopard.

По-видимому, echo действительно поддерживает -e переключатель, так как это правильно интерпретирует \n при использовании его:

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


~ $ 

Но когда я пытаюсь использовать \e, Я получаю это:

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

Как я сказал в Leopard, вышеупомянутое даст мне строку "ЦВЕТА" в цвете.

Кто-либо знает о причине, почему это могло бы быть намеченным изменением? Как насчет обходного решения для печати escape-последовательностей ANSI из сценариев Bash на Snow Leopard?

Версия оболочки Bash на моей машине Leopard 3.2.17(1)-release и 3.2.48(1)-release на моей машине Snow Leopard.

36
задан 01.11.2009, 03:28

7 ответов

Я не могу сказать Вам, почему это не поддерживает тот аргумент (Вам, вероятно, придется спросить программистов об этом). Я только знаю, что на моем поле Linux, получаю это:

$ /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 Escape
  • это говорит, что это /bin/echo от гну coreutils. Поскольку яблоко изменяет источник их компонентов системы Unix время от времени (например, перемещение от zsh для избиения), проверьте, было ли изменение для /bin/echo между Leopard и Snow Leopard. Если это - гну, можно спросить людей по gnu.org, почему они принимают решение не включать те последовательности.

Что касается обходных решений (thats более интересный): Не использование /bin/echo, но встроенный удар echo работы над полями Linux. Если бы они изменились на удар без встроенного эха (или что-то еще более неясное), то Вы могли также попробовать это не широко известная функция Вашей оболочки (работы, по крайней мере, в ударе и 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.
24
ответ дан 07.12.2019, 08:55

Попробовать \x1B вместо \e.

49
ответ дан 07.12.2019, 08:55

Делает \033 все еще работа? В противном случае можно, надо надеяться, нажать Ctrl+V, сопровождаемый Клавишей выхода (если Mac имеет те ключи) для создания реального управляющего символа в командной строке (который, не работает что хорошо в сценариях, конечно, в зависимости от редактора),

15
ответ дан 07.12.2019, 08:55

Еще один способ распечатать escape-последовательности ANSI в оболочке при помощи /usr/bin/printf.

11
ответ дан 07.12.2019, 08:55

Они могли бы попытаться соответствовать POSIX: http://www.opengroup.org/onlinepubs/9699919799/

ОПЦИИ части указывают среди прочего:

Implementations shall not support any options.
2
ответ дан 07.12.2019, 08:55

Вы могли бы проверить, были ли, символы неASCII Escape'' неконтролируемы в меню параметров представления terminal.app.

0
ответ дан 07.12.2019, 08:55

К вашему сведению Мы как раз собираемся добавить поддержку \e/bin/echo и/usr/bin/printf в coreutils. Обратите внимание, что стандарты C не указывают \e, но gcc, жемчуг, удар, ksh и tcsh поддерживают его

2
ответ дан 07.12.2019, 08:55

Теги

Похожие вопросы