bash - 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?
解决方案
这应该可以解决问题:
( 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
.
推荐阅读
- kubernetes - 区别 pod 和部署
- android - Google Cloud Platform Firebase Installations Api 仅显示错误
- python - 在线性规划中设置一组变量的最小值
- python - 如何在 Python 脚本中将张量流数据集拆分为训练、测试和验证?
- python - 使用groupby函数画图的问题
- ios - 如何使用协议编码器快速编码 Int
- c# - System.ObjectDisposedException:无法访问已处置的对象,ASP.NET Core 3.1
- java - 哪个类实现了接口Action方法Perform()
- assembly - 为什么在数组中的值的情况下比较的工作方式不同
- spring-boot - SpringDoc app-doc.yaml 不显示招摇文档