Захват цветного вывода в переменную bash - PullRequest
9 голосов
/ 26 июля 2011

Я хочу записать вывод цвета из git status в переменную и распечатать его позже.

До сих пор я подошел к:

status=$(git status -s)
echo -e "$status"

Приведенный выше скрипт сохраняет новую строку без изменений (от thx до Захват многострочного вывода в переменную Bash ), но удаляет цвет из вывода.

Есть ли способ сохранить цвет в переменной и повторить его?

Ответы [ 3 ]

9 голосов
/ 26 июля 2011

Проблема не в том, что bash удаляет выводимый цвет перед сохранением текста, а в том, что git отказывается выдавать цветной вывод на первое место, возможно потому, что он может сказать, что его STDOUT не является терминалом. Многие команды делают это (например, ls). У большинства из них есть опция, указывающая им использовать цвет в любом случае, для использования именно в этой ситуации (например, --color для ls). Обратитесь к документации git, есть ли у нее такая опция переопределения.

2 голосов
/ 18 апреля 2014

Как упоминал Килиан Фот:

"Обратитесь к документации Git, есть ли у нее такая опция переопределения"

В документации Git сказано (http://git-scm.com/book/en/Customizing-Git-Git-Configuration#Colors-in-Git):

"если вы хотите использовать цветовые коды в перенаправленном выводе, вы можете вместо этогопередать флаг --color команде Git, чтобы заставить его использовать цветовые коды "

Используя git версии 1.9.2, я пытаюсь" git status --color "и" git --colorстатус ", но ни один из них, кажется, не имеет этот флаг действительным.Может быть, еще не реализовано?

Однако захват цветного вывода ls работает с этим:

IFS=""
output=$(ls -l --color)
echo -e "$output"
1 голос
/ 08 февраля 2014

Для конкретного git-решения вы можете заставить git предоставлять цвет с помощью опции конфигурации color.status.Чтобы переопределить запись конфигурации для этой единственной команды, используйте git -c color.status=always status.

Помните, что вывод команды, захваченный таким образом, не обязательно включает в себя завершающий перевод строки, поэтому вы захотите добавить его, если вы планируете напечатать егопозже.

out=$(git -c color.status=always status)
printf "$out\n"

Для более общего решения, которое работает с другими программами, которые не обеспечивают переопределение цвета, лучше сделать это с помощью скрипта, как показано на Может ли цветной вывод получаться черезперенаправление оболочки?

В этих случаях вы хотели бы использовать status=$(script -q /dev/null git status | cat)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...