Perl:在继续

时间:2017-10-13 19:01:55

标签: linux perl xdgutils

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

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

我对system的理解是它应该等到命令返回后再继续该程​​序。但是,当我执行此代码时,我收到一条消息“无法打开/tmp/diff14969/diffs.pdf”。如果我在xdg-open命令中将okular替换为system(这是我的系统默认设置),它可以按照我的意愿运行。 (同样,如果我硬编码生活在我系统上的任何pdf查看器,它也可以工作,但出于便携的原因,我不想这样做。)

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

1 个答案:

答案 0 :(得分:3)

componentWillReceiveProps(nextProps) { if(nextProps.dirty !== this.props.dirty) { ***do something here**** } } 使用不同的方式打开文件,具体取决于您使用的桌面环境。它实际上并不是“启动查看器”,而是(至少在Gnome中)要求桌面环境打开您的文件(例如在Gnome中使用xdg-open然后使用dbus)。

因此,除了通过做一些非便携式技巧之外,没有简单的方法可以知道观众的PID等待它退出。

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