Почему mplayer выходит из цикла Bash while? - PullRequest
0 голосов
/ 02 мая 2018

Когда я запускаю приведенный ниже скрипт, mplayer выдает приведенную ниже ошибку и не продолжает цикл while после нажатия return. если я заменю mplayer на mpv, это сработает. Я должен использовать mplayer, так как mpv не поддерживает видеоформаты, которые мне нужны для воспроизведения.

Я подозреваю, что проблема связана с перенаправлением дескриптора файла, но я должен был сделать это, чтобы пользовательский ввод работал в цикле while с переданными по каналу данными из find.

Назначение

Цель сценария - я хочу воспроизвести каждый файл в каталоге, и после просмотра видео он должен подсказать мне, что делать с файлом. Например. удалить, переименовать, переместить.

Вопрос

Кто-нибудь может увидеть, в чем проблема, или, возможно, как ее обойти?

#!/usr/bin/bash

exec 3<&0 # redirect std input to a different file descriptor
find . -maxdepth 1 -type f -name "*" | while read f; do

mplayer -really-quiet -msglevel all=-1 "$f"

echo $f
printf "What to do: "
IFS= read -r -u3 opt

done
exec 3<&- # Close fd3

Ошибка

do_connect: could not connect to socket
connect: No such file or directory
Failed to open VDPAU backend libvdpau_va_gl.so: cannot open shared object file: No such file or directory
Assertion 'm' failed at pulse/thread-mainloop.c:175, function pa_threaded_mainloop_lock(). Aborting.

1 Ответ

0 голосов
/ 02 мая 2018

Изменено для ответа из комментария, синтаксис оболочки для зацикливания файлов в текущем каталоге просто:

for f in *; do
    [[ -f $f ]] || continue
    ... do something with "$f"
done

Это будет работать с любым символом в именах файлов, включая пробелы.

Тест -f должен убедиться, что $ f - это файл (в противном случае продолжить).

Это также относится к случаю, когда нет файла: glob не раскрывается и "$f" равно "*".

Проблема с mplayer может быть связана с записью канала на стандартный ввод while .. done, поскольку ввод mplayer наследуется от вызывающей стороны, если mplayer использует весь ввод, вызывающая сторона будет иметь пустой ввод. другое исправление может заключаться в том, чтобы явно перенаправить ввод внутрь цикла while exec 0</dev/null или просто для команды mplayer mplayer .. </dev/null. или просто exec 0</dev/tty и в последнем случае exec 3<&0 / read -r -u3 opt больше не требуется, просто read -r opt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...