Perl:等待xdg-open退出后再继续



我有一个Perl脚本,它在临时目录$tempdir中生成一个pdf$pdffile,并使用xdg-open打开它。一旦用户查看完文件,脚本就应该删除工作目录。以下是我遇到问题的代码部分:

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

我对system的理解是,它应该等到命令返回后再继续程序。然而,当我执行此代码时,我会收到一条消息"Cannot open/tmp/dif14969/diffs.pdf"。如果我在system命令中将xdg-open替换为okular(这是我的系统默认值),它会按照我的意愿工作

我的猜测是xdg-open正在一个新进程中启动查看器,而system命令只等待xdg-open完成。一旦xdg-open成功返回,脚本就会在查看器打开文件之前删除临时目录。如何让脚本等待实际的查看器完成?

xdg-open根据您使用的桌面环境使用不同的方式打开文件。它实际上并没有"启动查看器",而是要求(至少在Gnome中)桌面环境打开您的文件(例如,在Gnome使用gio,后者反过来使用dbus)。

因此,除了做一些不可移植的把戏之外,没有简单的方法可以知道查看器的PID以等待其退出。

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

最新更新