ユーザーに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
パイプラインでプログラムを順番に実行するのではなく、シェルパイプラインはdate
最初の3つの呼び出しが実行されたときに以下のようにプログラムをほぼ同時に実行します(システムがより複雑になると実行時間が短くなります)。
$ date +%s; (date +%s >&2; sleep 3) | (date +%s >&2; sleep 5); date +%s
1502224035
1502224035
1502224035
1502224040
$
したがって、タイマーはtimeout
データのダウンロード中にそのデータを表示する前にすでにカウントダウンしています。wget
display
1つの回避策は、表示するファイルのリストがあるように事前にデータをダウンロードすることです。これにより、wget
その部分による遅延がなくなりますdisplay
。
#!/bin/sh
...
get_the_files_here
for f in a_glob_that_matches_the_files_here; do
timeout 10s display "$f"
done