Чому під час використання аргументу -e в MacOSX аргумент "ee" не підтримує "\ e" (escape)


36

Коли я намагаюся роздрукувати деякий кольоровий текст за допомогою вбудованої echoкоманди ANSI-послідовностей , здається, що \eпослідовність відходу в рядку, який я надаю, інтерпретується буквально замість того, щоб «втеча», яку вона повинна представляти. Це трапляється лише у Snow Leopard - приклади нижче працюють так, як задумано в Leopard.

Мабуть echo, підтримує -eкомутатор, оскільки він правильно інтерпретує \nпри його використанні:

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


~ $ 

Але коли я намагаюся використовувати \e, я отримую таке:

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

Як я вже говорив, у Леопарді вищесказане додало б мені кольорову рядок "КОЛОРИ"

Хтось знає причину, чому це може бути цільова зміна? Як щодо рішення щодо друку послідовностей втечі ANSI із сценаріїв Bash на Snow Leopard?

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


1
Питання суперечить посту. У запитанні ви посилаєтесь на / bin / echo, тоді як у публікації ви використовуєте ехо без шляху, який, швидше за все, є вбудованим відлунням вашої оболонки.
0x89

Звичайно - дякую за те, що помітили. Я зафіксував питання, щоб це відобразити.
hasseg

Відповіді:


24

Я не можу сказати, чому він не підтримує цей аргумент (можливо, вам доведеться запитати програмістів про це). Я знаю лише, що в моєму вікні 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втечі
  • в ній сказано, що це /bin/echoвід gnu coreutils. Коли Apple час від часу змінює джерело компонентів своєї системи Unix (наприклад, перехід від zsh до bash), перевірте, чи не було змін /bin/echoміж Leopard та Snow Leopard. Якщо це gnu, ви можете запитати людей на gnu.org, чому вони вирішили не включати ці послідовності.

Щодо обхідних шляхів (що цікавіше): Не використовується /bin/echo, але вбудований bash echoпрацює на скриньках Linux. Якщо вони змінилися на bash без вбудованого відлуння (або чогось ще більш незрозумілого), ви також можете спробувати цю не широко відому особливість вашої оболонки (працює принаймні в bash і zsh):

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

Це відповідна частина manh:

   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'те, що я втікаю послідовність.
hasseg

1
\eне є частиною стандарту POSIX; реалізація основних технологій GNU поширюється на стандарт. OS X цього не зробив.
Martijn Pieters


15

Чи \033все ще працює? Якщо ні, то, сподіваємось, ви можете натиснути Ctrl + V, а потім клавішу Escape (якщо у mac є ці клавіші), щоб створити реальний керуючий символ всередині командного рядка (який не добре працює в сценаріях, звичайно, залежно від редактора)


5
\033замість того \e, щоб працювати, дякую.
hasseg

4
Для довідки 33- восьмеричне значення символу Escape .
TachyonVortex

Просто для майбутнього читацького посилання 033було б стандартизований спосіб написання восьмерики.
ocodo

11

Ще один спосіб друку послідовностей втечі ANSI в оболонці - це використання /usr/bin/printf.


3
printf - це портативний спосіб відображення речей в оболонці. Занадто багато ароматів ехо ...
mouviciel

6

Щоб доповнити існуючу корисну відповідь деякою довідковою інформацією :

Якщо ви посилаєтесь лише echoна ім’я - на відміну від його шляху, /bin/echo- ви посилаєтесь на вбудований Bash, а не на зовнішню утиліту.

Поведінка рідних елементів Bash, таких як вбудовані, як правило, портативні в сенсі Bash, тобто вони повинні працювати однаково на будь-якій платформі, здатній запускати Bash .

\e- цікавий виняток, який впливає на версії 3.x Bash на macOS (до сьогодні, з версії 10.13.5 (High Sierra), macOS поставляється із застарілими 3.x версіями Bash з юридичних причин).

\e(і його псевдонім \E) повинен працювати echo -e; \eпідтримку додано echoвбудований в Bash 2.0 . , але це незрозуміло - у версії 3.x на macOS.

\e робить роботу в 3.x Bash версії на інших платформах, таких як MSYS на Windows.

І навпаки, якщо ви встановите та використовуєте 4.x Bash на macOS, \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, ми щойно збираємося додати \ e підтримку до / bin / echo та / usr / bin / printf в coreutils. Зверніть увагу, що стандарти C не вказують \ e, але gcc, perl, bash, ksh і tcsh підтримують це


0

Ви можете перевірити, чи не було встановлено прапорець «Уникнути символів, що не належать до асацій» у меню параметрів перегляду терміналу.app.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.