我试图使用tee
获取一个有颜色的程序输出,并将其输出。我希望终端(stdout)上的输出具有颜色,但输出文件则没有。这是否可行?
./myScript.sh | filter_escapes | tee outfile.log
ls --color=always | sed -r 'w /dev/stderr' | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/test
将 ls --color=always
替换为 ./your_script &,将 /tmp/test
替换为您想要的输出文件名。
其他实现方式:
ls --color=always | tee >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/abcd)
tee >(sed .... > logfile)
语法是的,这是可能的。通过 sed
将您想要进入输出文件的结果传输,以删除用于格式化颜色的转义字符:
在 Linux 上:
sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
在OS X上,因为它不是GNU sed:
sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
tee
的功能:
https://github.com/sampson-chen/sack/blob/master/sack
ack --color $sack__flags $@ $sack__cwd | tee >$sack__dev_null >(display_shortcuts) >(process_shorcut_paths | remove_escaped_chars > $sack__shortcut_file)
函数remove_escaped_chars
包含一个检查操作系统版本的步骤,然后应用如上所示的sed
脚本。
(注1:tee
会自动将输出的副本重定向到stdout,因此我使用了>$sack__dev_null
来防止这种情况:因为我想要添加额外的信息到打印到stdout中的内容中,正如在函数display_shortcuts
中定义的那样)
(注2:tee
本身绝对不会在我使用它时删除颜色格式化:我的怀疑是其他工具在使用管道时的默认行为。)
tee
命令从标准输出和输出文件中都删除了它们。换句话说,我正在尝试做与您建议的相反的事情(输出文件看起来很好,但标准输出并不按照我想要的方式工作)。 - pap42grep
这样的工具,当作为管道的一部分使用时,默认会关闭颜色格式(您可以通过使用 grep 查找某些内容,然后将其传输到另一个 grep 来测试此功能)。要通过管道保留颜色格式,您需要查看这些工具是否有一些选项来实现此目的(例如 grep
的 --color=always
选项)。我自己使用 tee
时肯定不会删除颜色格式:我怀疑是其他工具在管道中的默认行为。 - sampson-chentee
直接输出带有颜色的内容。而传输到标准输出的内容则没有颜色... - pap42
sudo apt-get install expect-dev
安装该软件包。问题解锁后,我会尽快发布关于此的答案。请参见https://dev59.com/BFTTa4cB1Zd3GeqPtYxB。 - Mihai Danila