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



当我运行下面的脚本时,mplayer给出了以下错误,并且在按回车键后没有继续 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消耗整个输入,则调用方将有一个空输入。 另一个修复可能是在循环exec 0</dev/null或仅用于mplayer的命令mplayer .. </dev/null中显式重定向输入。 或者只是exec 0</dev/tty,在最后一种情况下不再需要exec 3<&0/read -r -u3 opt只是read -r opt

相关内容

  • 没有找到相关文章

最新更新