首页 > 解决方案 > Bash 将标准输出、标准错误和管道转发到外部程序

问题描述

我有一个运行 python 脚本并在 stdout 和 stderror 上产生输出的 Bash 命令。

使用以下命令将正常和错误日志写入单独的文件:

python3 file.py >> normal.log 2>> error.log

此外,stdout 和 stderr 应转发到外部程序(例如 logToTelegram.sh):

python3 file.py 2>&1 | logToTelegram.sh

有没有办法在一次执行期间同时实现,写入日志文件(正常和错误)并将标准输出和标准错误一起传送到程序 logToTelegram.sh?

标签: bash

解决方案


这应该可以解决问题:

( python3 file.py 2> >(tee -a error.log) > >(tee -a normal.log) ) | logToTelegram.sh

请注意,2> >(tee ...)必须将其放在之前> >(tee ...)才能正常工作。为简单起见,这两个tee命令都输出到标准输出,无需2>&1在管道传输到logToTelegram.sh.


或者,为了更接近原始代码并更准确地说:

( python3 file.py > >(tee -a normal.log) 2> >(tee -a error.log >&2) ) 2>&1 | logToTelegram.sh

这里,第一个tee输出到 stdout,而第二个tee输出到 stderr,因此2>&1需要将所有输出发送到logToTelegram.sh.


推荐阅读