Bash中如何将stdout、stderr同时写独立日志和管道转发给外部程序
实现方案
你可以借助Bash的进程替换特性,单次运行脚本即可同时满足两个需求,命令如下:
python3 file.py > >(tee -a normal.log) 2> >(tee -a error.log >&2) 2>&1 | logToTelegram.sh
各部分逻辑说明
> >(tee -a normal.log):将标准输出(stdout)导入tee命令,tee会将内容追加写入normal.log,同时将相同内容输出到当前shell的标准输出2> >(tee -a error.log >&2):将标准错误(stderr)导入另一个tee命令,tee将内容追加写入error.log后,把输出重新导回标准错误流,避免和标准输出提前混淆2>&1 | logToTelegram.sh:将前面输出的标准输出、标准错误合并,通过管道传递给logToTelegram.sh处理
注意事项
- 进程替换是Bash、Zsh等常用shell的特性,POSIX标准的sh不支持该语法,执行前确认你的运行环境是兼容的shell
tee命令的-a参数对应你之前>>的追加写入效果,如果需要每次执行覆盖日志文件,删除该参数即可
内容的提问来源于stack exchange,提问作者Freude
相关产品推荐
相关产品推荐

