Brydon Gibson Asked: 2018-03-06 07:15:30 +0800 CST2018-03-06 07:15:30 +0800 CST 2018-03-06 07:15:30 +0800 CST xdg-open 阻塞直到生成的进程被杀死 772 我有很多文档要查看,我想一个一个地查看它们,所以当我关闭上一个时,下一个会打开。 我以前用 evince 做过这个,用 for i in `ls | grep .pdf`; do evince $i; done 但是,对 xdg-open 执行相同操作会失败,因为 xdg-open 不会像 evince 那样阻塞。 有没有办法运行相同的 for 循环,但使用 xdg-open,这样当我关闭打开的应用程序时,for 循环的下一次迭代运行? bash xdg-open 1 个回答 Voted Best Answer Jeff Schaller 2018-03-06T08:36:13+08:002018-03-06T08:36:13+08:00 我找不到干净的方法,所以这是一种解决方法;打开每个文件,然后运行一个繁忙的循环,等待“the”匹配进程退出。我还更新了您的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 上)将其替换为亚秒级睡眠,或者简单:的完全不等待。
我找不到干净的方法,所以这是一种解决方法;打开每个文件,然后运行一个繁忙的循环,等待“the”匹配进程退出。我还更新了您的
for
循环,以便您不解析 ls 并引用文件名参数:这里的假设是 xdg-open 将打开文件;该过程被桌面环境分叉,控制权返回给脚本。然后该脚本收集 tty、会话和当前用户 ID,并要求
pgrep
查找匹配所有这些条件的(该)进程:...所有这些都是为了只捕获 xdg-open 启动的相应进程。
当该进程不再存在时,我们继续
for
循环到下一个文件。如果一秒延迟太长,您可以(在 Linux 上)将其替换为亚秒级睡眠,或者简单
:
的完全不等待。