首页 > 解决方案 > 为什么mplayer在循环时退出Bash?

问题描述

当我运行以下脚本时mplayer,会出现以下错误,并且在按回车后不会继续 while 循环。如果我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.

标签: linuxbashfile-descriptormplayer

解决方案


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

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

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

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

这也处理没有文件的情况:glob 没有展开并且"$f""*".

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


推荐阅读