bash tee remove color

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

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

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

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] содержит строку Файл журнала: ... в конце даже после закрытия файловых файлов 4 и 5. Мне удалось решить эту проблему, поместив sleep 1 перед вторым exec - я предполагаю, что в этом виновато состояние гонки или махинации fd. К сожалению для вас, ребята, я не могу воспроизвести эту проблему с помощью test.sh , но меня интересуют любые предположения, которые могут возникнуть у кого-то.

9
задан Jonathan Leffler 4 January 2012 в 05:17
поделиться