linux - 为什么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.
解决方案
更改为从评论中回答,用于循环当前目录中文件的 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
推荐阅读
- javascript - 我能否识别出调整大小的 div 已溢出并将不再可见的内容放置在 DOM 上的其他位置或 JS 变量中?
- javascript - 使用 useContext 和键反应生产构建失败
- javascript - 如何更快地将图像从 unsplash 加载到网页作为背景图像?
- database - 无法显示数据库中的图像
- java - Spark java错误,我无法启动应用程序
- vb.net - 从我的数据库中检索空间数据时出错
- python - 使用 Shapely 将 2 列转换为 WKB
- javascript - 错误:微调器(...):渲染没有返回任何内容。这通常意味着缺少 return 语句。或者,不渲染任何内容,返回 null
- javascript - 我们如何在 node.js 服务器中使用 pytesseract
- r - 使用 postgresapp 中的 gdal 为 r 安装 sf