当我跑步时
youtube-dl -j "$youtube_url" | jq
我得到了一个很好的 json 输出。然而,当我运行
json=$(youtube-dl -j "$youtube_url" | jq)
然后jq
打印其使用页面,之后 youtube-dl 出现错误broken pipe
。json
-variable 为空。
我猜想jq
之前运行过youtube-dl
,由于 stdin 上没有数据,因此它会终止打印使用说明。当jq
不再运行时,没有管道可以写入,因此youtube-dl
会失败。不过这只是猜测。我真的不明白这里发生了什么。请赐教!
答案1
jq
如果 stdout 不是终端,则不带过滤器的调用将引发错误。[…] 尝试jq '.'
。[…] 请注意,过滤器并不是真正可选的。
就你的情况而言:
json=$(youtube-dl -j "$youtube_url" | jq '.')
边注:
一般来说,当你运行 时,如果读取速度不够快foo | bar
,wellwritten会等待;如果写入速度不够快,wellwritten也会等待。哪一个先启动并不重要。foo
bar
bar
foo
我们可以争论jq
它是否“写得好”。但你的问题源于它依赖于 stdout 而不是 stdin 的古怪行为。你的假设是错误的。