我有一个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
后,脚本会在查看器打开文件之前删除临时目录。如何让脚本等待实际的查看器完成呢?
答案 0 :(得分:3)
componentWillReceiveProps(nextProps) {
if(nextProps.dirty !== this.props.dirty) {
***do something here****
}
}
使用不同的方式打开文件,具体取决于您使用的桌面环境。它实际上并不是“启动查看器”,而是(至少在Gnome中)要求桌面环境打开您的文件(例如在Gnome中使用xdg-open
然后使用dbus)。
因此,除了通过做一些非便携式技巧之外,没有简单的方法可以知道观众的PID等待它退出。
解决方案可以是使用模块gio
(包含在perl发行版中)并使用UNLINK / CLEANUP标志创建临时文件/目录,当持有对象的变量退出时,它会被删除范围(因此调用DESTROY方法)。这样,只要您的脚本运行(并且变量不会超出范围),就可以在文件系统中访问临时文件。