Я пытаюсь получить вывод программы (имеющей цвета) и выводить ее с помощью tee
. Я хочу, чтобы на выходе были цвета на терминале (stdout), но не на выходном файле. Возможно ли это?
Сохранять цвет при печати с помощью тройника
Ответ 1
Возможный подход - напечатать escape-символы на stderr и основное содержимое на stdout. Я сделал это в одном из script. Конечно, это не масштабируемый вариант.
Было бы интересным упражнением написать выделенный script, который анализирует stdin, помещает escape-последовательности на stderr и другие на stdout.:-)
затем
./myScript.sh | filter_escapes | tee outfile.log
Я не видел никаких script, которые это делают, но я думаю, было бы интересно написать один, если он еще не был доступен.
Что касается вашего вопроса, я думаю, что ниже должно быть достаточно:
ls --color=always | sed -r 'w /dev/stderr' | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/test
замените ls --color=always
на. /your _script и /tmp/test
на ваше предполагаемое имя выходного файла.
Другая реализация:
ls --color=always | tee >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/abcd)
Примечание: tee >(sed .... > logfile)
синтаксис
Примечание:
1. regex заимствован из ответа sampson-chen.
2. Команда w для /dev/stderr в sed - дополнение GNU sed.
Ответ 2
Да, это возможно. Произведите вывод результатов, которые вы хотите перейти в выходной файл с помощью sed
, чтобы удалить escape-символы, используемые в цветах форматирования:
В Linux:
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
В OS X, так как это не GNU sed:
sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Часть инструмента, который я написал недавно, делает именно то, что вы описали с помощью tee
:
https://github.com/sampson-chen/sack/blob/master/sack
ack --color $sack__flags [email protected] $sack__cwd | tee >$sack__dev_null >(display_shortcuts) >(process_shorcut_paths | remove_escaped_chars > $sack__shortcut_file)
где функция remove_escaped_chars
содержит проверку для версии ОС, затем применяет sed
script, как показано выше.
(Примечание 1: tee
автоматически перенаправляет копию вывода в stdout, поэтому я использовал >$sack__dev_null
, чтобы предотвратить это: потому что я хотел добавить дополнительную информацию к материалу, напечатанному на stdout, как определено в функции display_shortcuts
)
(Примечание 2: tee
сам определенно никогда не удалял форматирование цвета, когда я его использовал. Мое подозрение - поведение других инструментов по умолчанию с каналами.)