사용자에게 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
처음 세 호출이 실행될 때 아래와 같이 프로그램을 거의 동시에 실행합니다(시스템이 더 복잡해지면 실행 시간이 줄어듭니다).
$ 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
다운로드가 완료될 때까지 실행을 지연해야 합니다 .