![在命令替换中从 youtube-dl 传输到 jq](https://linux22.com/image/1623455/%E5%9C%A8%E5%91%BD%E4%BB%A4%E6%9B%BF%E6%8D%A2%E4%B8%AD%E4%BB%8E%20youtube-dl%20%E4%BC%A0%E8%BE%93%E5%88%B0%20jq.png)
当我跑步时
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 的古怪行为。你的假设是错误的。