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