在命令替换中从 youtube-dl 传输到 jq

在命令替换中从 youtube-dl 传输到 jq

当我跑步时

youtube-dl -j "$youtube_url" | jq

我得到了一个很好的 json 输出。然而,当我运行

json=$(youtube-dl -j "$youtube_url" | jq)

然后jq打印其使用页面,之后 youtube-dl 出现错误broken pipejson-variable 为空。

我猜想jq之前运行过youtube-dl,由于 stdin 上没有数据,因此它会终止打印使用说明。当jq不再运行时,没有管道可以写入,因此youtube-dl会失败。不过这只是猜测。我真的不明白这里发生了什么。请赐教!

答案1

已解答在 Stack Overflow 上

jq如果 stdout 不是终端,则不带过滤器的调用将引发错误。[…] 尝试jq '.'。[…] 请注意,过滤器并不是真正可选的。

就你的情况而言:

json=$(youtube-dl -j "$youtube_url" | jq '.')

边注:

一般来说,当你运行 时,如果读取速度不够快foo | bar,wellwritten会等待;如果写入速度不够快,wellwritten也会等待。哪一个先启动并不重要。foobarbarfoo

我们可以争论jq它是否“写得好”。但你的问题源于它依赖于 stdout 而不是 stdin 的古怪行为。你的假设是错误的。

相关内容