当我运行下面的脚本时,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.
答案 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