2013-09-02 2 views
1

Я знаю, что в Баш я могу напечатать красочные строки, как:Как делает grep цвет?

echo -e "\033[33;1mhello\033[0m" 

Выход в оболочке будет hello с золотистым цветом. Но когда я перенаправляю вывод в файл test.txt, \033[33; также будет в текстовом файле. Однако команда grep --color=auto не перенаправляет эти символы в текстовый файл. Как это можно сделать?

+0

Похож дубликатом http://stackoverflow.com/questions/911168/how-to-detect-if-my-shell-script-is-running-through-a -pipe – svante

ответ

1

Возможно, он использует библиотечную функцию isatty(3) в дескрипторе файла stdout (то есть 1). Поэтому используйте

if (isatty(STDOUT_FILENO)) { 
    // enable auto colorization 
} 

в вашем C-коде.

В сценарии оболочки, используйте tty(1) команду:

if tty -s ; then 
    # enable auto colorization 
fi 

или просто -ttest(1)

if [ -t 1 ]; then 
    # enable auto colorization 
fi 
+0

Есть ли утилита командной строки для выполнения этой работы для меня? – wenlibin02

+0

Существуют различные сценарии для удаления цветовых кодов и всех видов контрольных символов, например. один из этого [вопрос] (http://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output). – scai

+0

Спасибо. Понимаю. Но этот скрипт perl не работает, по крайней мере, для китайских слов. Версия sed может быть лучше: http://www.commandlinefu.com/commands/view/3584/remove-color-codes-special-characters-with-sed – wenlibin02

4

Как об этом?

#!/bin/bash 

if [ -t 1 ]; then 
    echo -e "\033[33;1mhello\033[0m" 
else 
    echo hello 
fi 

Вот объяснение:

test -t <fd>, чья короткая форма [ -t <fd> ], проверяет, является ли дескриптор <fd> это терминал или нет. Источник: help test

0

Используйте переменную GREP_COLORS с флагом экспорта. Испытано это, и она работает:

export GREP_COLORS='ms=01;33' 
grep --color=auto -e hello 
Смежные вопросы