У меня такой код:
#!/bin/bash
COLOR_REST='\e[0m'
COLOR_GREEN='\e[0;32m'
echo -e "${COLOR_GREEN}OK${COLOR_REST}"
Когда я копирую и вставляю код в свой iTerm, он отображает OK зеленого цвета.
Однако, когда я сохраняю код в файле с именем testColor.sh и выполняю ./testColor.sh. На моем экране отображается \e[0;32mOK\e[0m.
Почему он не отображает OK зеленым?
Я также пробовал bash testColor.sh и sh testColor.sh. Оба не отображают текст зеленым цветом.
Еще мне кажется странным, что я не вижу опции -e в Руководстве по общим командам BSD в man echo.
В качестве операционной системы я использую macOS High Sierra.





Использование printf вместо echo должно работать в любой POSIX-совместимой оболочке. Я пробовал это в High Sierra с терминалом по умолчанию, и это не сработало (не было никаких расширенных опций, только -n).
Что касается объяснения, я не использовал iTerm, поэтому я не совсем уверен, но может быть другая реализация echo от iTerm, которая заставит флаг работать только при использовании самого iTerm, а не / bin / bash. Обратите внимание, что на странице руководства для echo говорится:
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.
Использовать
#!/bin/bash
COLOR_REST = "$(tput sgr0)"
COLOR_GREEN = "$(tput setaf 2)"
printf '%s%s%s\n' $COLOR_GREEN 'OK' $COLOR_REST
который использует printf, чтобы избежать опций echo, и tput для переноса на разные терминалы.
Другой статья говорит, что \e, \033 и \x1B представляют Эскейп-персонаж в bash. Возможно, моя команда echo не поддерживает \e.
tputвместо кодов ANSI.