首页 > 解决方案 > 从 bash 脚本转发流

问题描述

我有一个帮助脚本来调试 go 中的服务器,名为 debug.sh,返回 JSON 日志,并能够处理最终错误(恐慌,...)

!#/bin/sh

go run server.go 2>&1 | jq -Rr '. as $raw | try fromjson catch $raw'

然后,当我执行 ./debug.sh 时,我会以一种很好的方式打印我的日志,并且如果有错误会被捕获。

./debug.sh
{
  "severity": "info",
  "message": "Worker 095d1c8a-5abe-47a3-b945-68be2ded4d83 ready."
}

但是如果想做额外的处理:

./debug.sh | jq -r ".message"

我没有任何输出。

我想那是因为管道在下标中被阻塞了,我可以从我的终端做所有 JQ 的事情,但我希望脚本易于使用。

我该如何解决?

标签: bashshell

解决方案


管道中的命令默认是完全缓冲的。如果您想让它们以交互形式执行,请禁用缓冲。

jq --unbufferedpython -u或者stdbuf -oL是一些允许以无缓冲方式运行命令的示例。


推荐阅读