我有一个帮助脚本调试服务器的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操作,但我希望脚本易于使用。
如何解决这个问题?
管道中的命令默认是完全缓冲的。如果你想让它们以交互的形式执行,请禁用缓冲。
jq --unbuffered
python -u
或stdbuf -oL
是一些例子,允许以一种无缓冲的方式运行命令。