我正在尝试向用户显示来自 youtube 的特定超时缩略图,然后显示下一个我执行了以下命令:
while read line; do\
wget -O- -q "$line" | \
timeout 10s display ;\
done < <(youtube-dl --get-thumbnail https://www.youtube.com/watch?v=jPBdQRkWvGY https://www.youtube.com/watch?v=ybLXm5LOSks https://www.youtube.com/watch?v=9fr3ECCSo6U https://www.youtube.com/watch?v=EKST1uliDU8 )
但图像显示的时间是随机的(有些是 10 秒,有些是 1 秒!!)
有谁知道他们有什么问题吗?
答案1
shell 管道不是一个接一个地执行管道中的程序,而是或多或少同时执行(随着系统变得越来越繁忙,执行时间会减少),如以下前三个调用date
执行时所示:
$ date +%s; (date +%s >&2; sleep 3) | (date +%s >&2; sleep 5); date +%s
1502224035
1502224035
1502224035
1502224040
$
因此,计时器在忙于下载数据但有机会显示所述数据之前timeout
已经开始倒计时。wget
display
一种解决方法是提前下载数据,以便有一个可供显示的文件列表;这将消除wget
该部分造成的延迟display
。
#!/bin/sh
...
get_the_files_here
for f in a_glob_that_matches_the_files_here; do
timeout 10s display "$f"
done
答案2
我想问题在于你timeout
看到了不同的起点:
对于您来说,超时应该在图像显示时开始。但因为timeout
它从开始时就开始了。
这两个时间点之间存在一个“随机”间隙:下载时间。您必须延迟执行,timeout
直到下载完成。