Perl:在继续之前等待xdg-open退出

问题描述:

我有一个Perl脚本,它在临时目录$tempdir中生成pdf $pdffile并使用xdg-open将其打开。一旦用户查看文件,该脚本应该删除工作目录。下面是我遇到的麻烦的部分代码:Perl:在继续之前等待xdg-open退出

system "xdg-open $pdffile"; 
remove_tree($tempdir); 

我的system理解是,它应该等到继续程序之前的命令返回。但是,当我执行此代码时,我收到消息“无法打开/tmp/diff14969/diffs.pdf”。如果我在system命令中将xdg-open替换为okular(这是我的系统默认值),它将按我的需要工作。 (同样,如果我硬编码生活在我的系统上的任何PDF查看器,它的工作原理,但我不想这样做的便携性的原因。)

我的猜测是xdg-open启动一个新的过程中的查看器, system命令仅等待xdg-open完成。一旦xdg-open成功返回,脚本将在查看器打开文件之前删除临时目录。我怎样才能让脚本等待实际查看器完成呢?

xdg-open根据您使用的桌面环境使用不同的方式打开文件。它实际上并不“启动查看器”,但会询问(至少在Gnome中)打开文件的桌面环境(例如,在Gnome中使用gio,而后者使用dbus)。

因此,没有简单的方法来知道观看者的PID等待它退出,除非做一些不便携的诡计。

一个解决方案可能是使用模块File::Temp(包含在perl发行版中)并使用UNLINK/CLEANUP标志创建临时文件/目录,以便在持有对象的变量超出范围时删除它(因此调用DESTROY方法)。这样,只要脚本运行(并且变量没有超出范围),临时文件就可以在文件系统中访问。