тройник удалить цвет - PullRequest
       29

тройник удалить цвет

8 голосов
/ 04 января 2012

В настоящее время я использую следующее, чтобы захватить все, что идет в терминал и выбросить его в файл журнала

exec 4<&1 5<&2 1>&2>&>(tee -a $LOG_FILE)

однако, я не хочу, чтобы цветовые escape-коды / беспорядок входили в файл журнала. так что у меня есть что-то вроде этого, что Сорта работает

exec 4<&1 5<&2 1>&2>&>(
    while read -u 0; do
        #to terminal
        echo "$REPLY"
        #to log file (color removed)
        echo "$REPLY" | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' >> $LOG_FILE
    done
    unset REPLY #tidy
)

кроме read ожидает возврата каретки, что не идеально для некоторых частей сценария (например, echo -n "..." или printf без \n).


Продолжение ответа Джонатана Леффлера:

Учитывая пример скрипта test.sh:

#!/bin/bash

LOG_FILE="./test.log"
echo -n >$LOG_FILE

exec 4<&1 5<&2 1>&2>&>(tee -a >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > $LOG_FILE))


##### ##### #####
# Main

echo "starting execution"
printf "\n\n"

echo "color test:"
echo -e "\033[0;31mhello \033[0;32mworld\033[0m!"
printf "\n\n"

echo -e "\033[0;36mEnvironment:\033[0m\n  foo: cat\n  bar: dog\n  your wife: hot\n  fix: A/C"
echo -n "Before we get started. Is the above information correct?  "
read YES
echo -e "\n[READ] $YES" >> $LOG_FILE
YES=$(echo "$YES" | sed 's/^\s*//;s/\s*$//')
test ! "$(echo "$YES" | grep -iE '^y(es)?$')" && echo -e "\nExiting... :(" && exit
printf "\n\n"

#...some hundreds of lines of code later...

echo "Done!"


##### ##### #####
# End

exec 1<&4 4>&- 2<&5 5>&-

echo "Log File: $LOG_FILE"
  1. Выходной сигнал на терминал соответствует ожидаемому, и в файле журнала нет нужных кодов / помех от цвета в файле журнала. Однако после изучения test.log я не вижу [READ] ... (см. Строку 21 test.sh).

  2. Файл журнала [моего фактического скрипта bash] содержит строку Log File: ... в конце, даже после закрытия 4 и 5 fds. Я смог решить проблему, поставив sleep 1 перед вторым exec - я предполагаю, что есть условие гонки или fd shenanigans, чтобы обвинить в этом. К сожалению для вас, ребята, я не могу воспроизвести эту проблему с test.sh, но я был бы заинтересован в любых предположениях, которые могут возникнуть у любого.

Ответы [ 6 ]

3 голосов
/ 04 января 2012

Рассмотрите возможность использования программы pee, описанной в Можно ли распространять стандартный ввод по параллельным процессам .Это позволило бы вам отправлять данные журнала через ваш скрипт sed, продолжая при этом отправлять цвета на фактический вывод.

Одним из основных преимуществ этого является то, что он будет удалять 'execute sed один раз в строкевывода журнала ';это действительно дьявольски для производительности (с точки зрения количества выполненных процессов, если ничего больше).

1 голос
/ 04 января 2012

Я использую такие вещи, устанавливая TERM=dumb перед выполнением команды.Это в значительной степени удалило все управляющие символы, кроме tab, CR и LF.Я понятия не имею, работает ли это в вашей ситуации, но стоит попробовать.Проблема в том, что вы также не увидите цветовой кодировки на вашем терминале, так как это тупой терминал.

Вы также можете попробовать либо vis, либо cat (особенно параметр -v) и посмотреть,они что-то делают для вас.Вы бы просто поместили их в свой конвейер следующим образом:

exec 4<&1 5<&2 1>&2>&>(tee -a | cat -v | $LOG_FILE)

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

1 голос
/ 04 января 2012

Я знаю, что это не идеальное решение, но cat -v сделает невидимые символы, такие как \x1B, для преобразования в видимую форму, такую ​​как ^[[1;34m.Вывод будет грязным, но это будет как минимум текстовый файл.

0 голосов
/ 04 января 2012

Может ли screen -L или команды script быть жизнеспособными вариантами вместо этого цикла exec?

0 голосов
/ 04 января 2012

Вы можете использовать ANSIFilter для удаления или преобразования вывода консоли с помощью escape-последовательностей ANSI.

См. http://www.andre -simon.de / zip / download.html # ansifilter

0 голосов
/ 04 января 2012

Вы можете попытаться использовать опцию -n для чтения. Он читает n символов вместо ожидания новой строки. Вы можете установить его на один. Это увеличило бы количество итераций, выполняемых кодом, но не дожидается перевода строки.

От мужчины:

-n NCHARS read returns after reading NCHARS characters rather than waiting for a complete line of input.

Примечание: я не проверял это

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