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