gpt4 book ai didi

bash tee 去除颜色

转载 作者:行者123 更新时间:2023-11-29 08:53:26 25 4
gpt4 key购买 nike

我目前正在使用以下内容来捕获进入终端的所有内容并将其放入日志文件中

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

但是,我不想让颜色转义码/困惑进入日志文件。所以我有这样的东西,有点管用

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
)

except read 等待回车,这对于脚本的某些部分来说并不理想(例如 echo -n "..."printf 没有 \n)。


Jonathan Leffler 回答的跟进:

给定示例脚本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] ...(请参阅 test.sh 的第 21 行)。

  2. 即使在关闭 4 和 5 fds 之后,[我的实际 bash 脚本的] 日志文件的末尾也包含 Log File: ... 行。我能够通过在第二个 exec 之前放置一个 sleep 1 来解决这个问题 - 我假设存在竞争条件或 fd 恶作剧。不幸的是,对于你们来说,我无法用 test.sh 重现这个问题,但我会对任何人可能有的任何猜测感兴趣。

最佳答案

考虑使用 Is it possible to distribute stdin over parallel processes 中讨论的 pee 程序.它允许您通过 sed 脚本发送日志数据,同时继续将颜色发送到实际输出。

这样做的一个主要优点是它会删除“每行日志输出执行一次 sed”;这对性能来说确实是恶魔般的(就执行的进程数而言,如果没有别的)。

关于bash tee 去除颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com