В настоящее время я использую следующее, чтобы захватить все, что идет в терминал и выбросить его в файл журнала
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"
Выходной сигнал на терминал соответствует ожидаемому, и в файле журнала нет нужных кодов / помех от цвета в файле журнала. Однако после изучения test.log
я не вижу [READ] ...
(см. Строку 21 test.sh
).
Файл журнала [моего фактического скрипта bash] содержит строку Log File: ...
в конце, даже после закрытия 4 и 5 fds. Я смог решить проблему, поставив sleep 1
перед вторым exec
- я предполагаю, что есть условие гонки или fd shenanigans, чтобы обвинить в этом. К сожалению для вас, ребята, я не могу воспроизвести эту проблему с test.sh
, но я был бы заинтересован в любых предположениях, которые могут возникнуть у любого.