为什么mplayer在循环时退出Bash?

时间:2018-05-02 07:12:39

标签: linux bash file-descriptor mplayer

当我运行下面的脚本时,mplayer给出了以下错误,并且在按下return后没有继续while循环。如果我将mplayer替换为mpv则可行。我必须使用mplayer,因为mpv不支持我需要播放的视频格式。

我怀疑问题与文件描述符重定向有关,但我必须这样做才能让用户输入在find的管道数据的while循环中工作。

目的

脚本的目标是我想播放目录中的每个文件,在观看视频后,它应该提示我如何处理该文件。例如。删除,重命名,移动。

问题

任何人都可以看到问题是什么,或者可能如何解决它?

#!/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 :(得分:1)

更改为从评论回答,shell语法循环到当前目录中的文件只是:

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

这适用于包含空格的文件名中的任何字符。

-f测试是为了确保$ f是一个文件(否则继续)。

这也处理没有文件的情况:未展开glob,"$f""*"

mplayer的问题可能是由于管道写入while .. done的标准输入,因为mplayer输入是从调用者继承的,如果mplayer正在消耗整个输入,则调用者将有一个空输入。另一个修复可能是在循环exec 0</dev/null内显式重定向输入,或者仅用于mplayer的命令mplayer .. </dev/null。或只是exec 0</dev/tty而在最后一种情况下exec 3<&0 / read -r -u3 opt不再需要read -r opt