xdg-open 阻止直到生成的进程被终止

xdg-open 阻止直到生成的进程被终止

我有很多文档要查看,我想一张一张地查看它们,所以当我关闭上一个文档时,下一个文档也会打开。

我以前已经用证据做过这件事

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 上)将其替换为亚秒级睡眠,或者简单地:完全不等待。

相关内容