Когда я пытаюсь распечатать некоторый цветной текст, используя 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
~ $
Как я уже говорил, в «Леопарде» вышесказанное даст мне строку «ЦВЕТА» в цвете.
Кто-нибудь знает причину, почему это может быть предполагаемое изменение? Как насчет обходного пути для печати escape-последовательностей ANSI из сценариев Bash на Snow Leopard?
Версия оболочки Bash на моей машине Leopard есть 3.2.17(1)-release
и 3.2.48(1)-release
на моей машине Snow Leopard.
Ответы:
Я не могу сказать вам, почему он не поддерживает этот аргумент (вам, возможно, придется спросить об этом программистов). Я только знаю, что на моей Linux-коробке я получаю это:
\e
побегов/bin/echo
от gnu coreutils. Поскольку apple время от времени меняет источник своих компонентов unix-системы (например, переход от zsh к bash), проверьте, не произошло ли изменение/bin/echo
между Leopard и Snow Leopard. Если это gnu, вы можете спросить людей на gnu.org, почему они решили не включать эти последовательности.Что касается обходных путей (это более интересно): Не используется
/bin/echo
, но встроенная функция bashecho
работает на Linux-боксах. Если они изменились на bash без встроенного эха (или чего-то еще более непонятного), вы также можете попробовать эту не очень известную функцию вашей оболочки (работает по крайней мере в bash и zsh):Это соответствующая часть справочной страницы bash:
источник
$'string'
чтобы быть escape-последовательностью, спасибо.\e
не является частью стандарта POSIX; реализация GNU coreutils расширена по стандарту. OS X не сделал.Попробуй
\x1B
вместо\e
.источник
\x1B
вместо того,\e
чтобы работать, спасибо.1B
это шестнадцатеричное значение символа Escape .Имеет ли
\033
еще работает? Если нет, то можно надеяться, что вы можете нажать Ctrl + V, а затем клавишу Escape (если у Mac есть эти клавиши), чтобы создать реальный управляющий символ в командной строке (что, конечно, не очень хорошо работает в сценариях, в зависимости от редактора)источник
\033
вместо того,\e
чтобы работать, спасибо.33
это восьмеричное значение символа Escape .033
будет стандартизированным способом записи восьмеричного.Еще один способ печати escape-последовательностей ANSI в оболочке - использование
/usr/bin/printf
.источник
Чтобы дополнить существующий полезный ответ некоторой справочной информацией :
Если вы вызываете только
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
это работает.источник
Они могут попытаться соответствовать POSIX: http://www.opengroup.org/onlinepubs/9699919799/
В ОПЦИИ части говорится, среди прочего:
источник
-e
.К вашему сведению, мы собираемся добавить поддержку \ e в / bin / echo и / usr / bin / printf в coreutils. Обратите внимание, что стандарты C не указывают \ e, но gcc, perl, bash, ksh и tcsh поддерживают его
источник
Вы можете проверить, не были ли отмечены «escape-не-ascii символы» в меню параметров просмотра файла Terminal.app.
источник