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

Why does mplayer exit Bash while loop?

当我 运行 下面的脚本 mplayer 给出以下错误并且在按下 return 后不继续 while 循环。如果我用 mpv 替换 mplayer 它就可以了。我必须使用 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.

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

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