Это в основном зависит от того, загружаются ли динамические библиотеки при запуске программы (, что было бы нормальным поведением с ld.so ), или лениво, когда код, который в них нуждается, впервые выполняется. В первом случае программа завершится с ошибкой очень рано. Во втором случае он может вообще не выполнять код, требующий динамической библиотеки, и просто работать успешно. Одним из примеров второго случая может быть программа обработки аудиофайлов, которая загружает аудиокодеки в зависимости от типа файла. Если у вас не установлен кодек mp3, он все равно может работать с другими типами файлов. (Комментарий муру указывает на вопрос, где это обсуждается более глубоко)
Вы можете использоватьinotifywait
:
$ youtube-dl "$URL" &
$ inotifywait --event create --format '"%f"'. | xargs vlc
Там есть состояние гонки, если ваше соединение очень быстрое (мое сейчас )файл может быть загружен и переименован до того, как ваш проигрыватель откроет его. Кроме того, если youtube-dl
делает что-то вроде загрузки аудио и видео по отдельности, вы можете открыть не тот файл.
Комментарий @fra -san напомнил мне о цикле while read
, который можно использовать для обработки строки вывода -с помощью -строки/процедурно (, а не функционально, с конвейерами )., вы можете использовать оператор <
для передачи вывода файла в этот цикл с помощью Bash Process Substitution команды youtube -dl, и вы также можете отправить его в фоновый режим, добавив &
и while Цикл все еще может прочитать его вывод (, он просто читает файл, который сделал BPS ).
В ходе тестирования я обнаружил, что могу нормально воспроизводить видео даже после того, как оно завершит загрузку и будет переименовано, хотя это может быть особенностью mpv.
#!/bin/bash
# ytdl-stream - use youtube-dl to stream videos i.e watch videos as they download
# usage: ytdl-stream [YOUTUBE_DL_OPTIONS] URL
# you can pipe into it a command to open you video player, e.g:
# echo mpv --mute=yes | ytdl-stream -f 'best[width<=1920,height<=1080]' --write-auto-sub [URL]
test ! -t 0 && player_cmd="$(cat /dev/stdin)" || player_cmd="mpv"
while IFS="" read -r line; do
filename=$(echo "$line" | sed -n 's/^\[download\] Destination: //p')
if [[ -z "$filename" ]]; then
filename=$(echo "$line" | sed -n 's/^\[download\] \(.*\) has already been downloade.*/\1/p')
[[ -z "$filename" ]] && continue || notify-send "file already downloaded, opening.."
else
notify-send "downloading.."
fi
withoutExtensions="${filename%.*}"
withoutExtensions="${withoutExtensions%.*}"
if [[ -e "$filename" ]]; then
sleep 0.5 && ($player_cmd "$filename")&
elif [[ -e "$filename".part ]]; then
sleep 2
if [[ -e "$filename".part ]]; then
notify-send "found.part after sleep again"
($player_cmd "$filename".part)&
else
sleep 0.5 && ($player_cmd "$withoutExtensions"*)&
fi
fi
done < <(youtube-dl "$@" 2> /dev/null)&