我有一个Perl脚本,它在临时目录$tempdir中生成一个pdf $tempdir,并使用xdg-open打开它。然后,当用户查看完文件后,脚本应该删除该工作目录。下面是我遇到麻烦的部分代码:
system "xdg-open $pdffile";
remove_tree($tempdir);我对system的理解是,它应该等到命令返回后才能继续执行程序。但是,当我执行这段代码时,我会收到一条消息“未能打开/tmp/ not 14969/Diffs.pdf”。如果我在xdg-open命令中将okular替换为okular(这是我的系统默认值),它将按我的意愿工作。(类似地,如果我对生活在系统上的任何pdf查看器进行硬编码,它也能工作,但出于可移植性的原因,我不想这样做。)
我的猜测是,xdg-open正在一个新的进程中启动查看器,而system命令只等待xdg-open完成。一旦xdg-open成功返回,脚本将在查看器打开文件之前删除临时目录。如何让脚本等待实际的查看器完成呢?
发布于 2018-02-14 23:40:35
根据您使用的桌面环境,xdg-open使用不同的方式打开文件。它实际上并不是“启动查看器”,而是要求(至少在Gnome中)桌面环境打开您的文件(例如,在Gnome中使用gio,然后使用dbus)。
因此,除了做一些不可移植的诡计之外,没有简单的方法可以知道查看器的PID值来等待退出。
一个解决方案可以是使用模块File::Temp (包括在perl发行版中),并使用UNLINK /清除标志创建临时文件/目录,当保存对象的变量超出作用域时,该标记会使其被删除(因此调用破坏方法)。这样,只要脚本运行(并且变量没有超出作用域),临时文件就可以在文件系统中访问。
https://stackoverflow.com/questions/46736478
复制相似问题