我有很多文档要查看,我想一张一张地查看它们,所以当我关闭上一个文档时,下一个文档也会打开。
我以前已经用证据做过这件事
for i in `ls | grep .pdf`; do evince $i; done
然而,对 xdg-open 执行相同的操作会失败,因为 xdg-open 不会像 evince 那样阻塞。
有没有办法运行相同的 for 循环,但使用 xdg-open,以便当我关闭已打开的应用程序时,for 循环的下一次迭代运行?
答案1
我找不到干净的方法,所以这是一个解决方法;打开每个文件,然后运行一个忙循环,等待“该”匹配进程退出。我还更新了您的for
循环,以便您不会解析 ls 并引用文件名参数:
#!/bin/bash
for i in *.pdf
do
xdg-open "$i"
t=$(tty)
t=${t##/dev/}
s=$(ps -o session= -p $$)
while pgrep -f "$i" --terminal "$t" --uid "$(id -u)" --session "$s" >/dev/null 2>&1
do
sleep 1
done
done
这里假设 xdg-open 将打开文件;该进程被桌面环境分叉,控制权返回到脚本。然后,该脚本收集 tty、会话和当前用户 ID,并要求pgrep
查找符合所有这些条件的进程:
- 完整的进程名称包括循环中的文件名
- 关联的终端是我们运行的终端
- 进程的UID与我们的相匹配
- 流程会话与我们的相匹配
...所有这些都是为了仅捕获 xdg-open 启动的相应进程。
当该进程不再存在时,我们继续循环for
到下一个文件。
如果一秒的延迟太长,您可以(在 Linux 上)将其替换为亚秒级睡眠,或者简单地:
完全不等待。