为什么xdotool命令在命令行可运行,在bash脚本中却无效果
问题根本原因
你脚本中的mupdf命令默认是前台阻塞执行的,Shell 会等待 mupdf 进程完全退出后,才会执行后续的sleep和xdotool相关命令,此时mupdf窗口已经被关闭,xdotool自然找不到目标窗口,也就不会有任何效果。
修复方案
- 给
mupdf命令末尾添加&符号,将其放到后台运行,这样Shell启动mupdf后会立刻执行后续逻辑,不需要等待进程退出。 - 可以移除无用的
eval语句,硬编码的sleep也可以替换为循环等待窗口加载的逻辑,适配不同机器的启动速度,避免窗口还没加载完就执行xdotool命令。
修正后的完整函数代码如下:
joc(){ # Joy of Cooking, joc [page #, def 823] # 末尾加&将mupdf放到后台运行 mupdf "$HD/ReadBooks/Rombauer/Rombauer-JoyOfCooking_11_823.pdf" "${1:-823}" & # 循环等待mupdf窗口加载完成,比硬编码sleep更可靠 until xdotool search --class mupdf > /dev/null 2>&1 do sleep 0.1 done xdotool search --class mupdf windowactivate --sync type "f]H" }
可选排查点
如果修改后仍存在问题,可按以下步骤排查:
- 手动执行
xdotool search --class mupdf,确认返回了mupdf的窗口ID,部分版本的mupdf窗口类名可能存在差异,可通过xprop命令点选mupdf窗口查看实际类名 - 确认当前用户有权限操作目标窗口,权限不足时xdotool会静默失败
内容的提问来源于stack exchange,提问作者user985675
相关产品推荐
相关产品推荐

