2017-10-13 80 views
3

我有一個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成功返回,腳本將在查看器打開文件之前刪除臨時目錄。我怎樣才能讓腳本等待實際查看器完成呢?

回答

2

xdg-open根據您使用的桌面環境使用不同的方式打開文件。它實際上並不「啓動查看器」,但會詢問(至少在Gnome中)打開文件的桌面環境(例如,在Gnome中使用gio,而後者使用dbus)。

因此,沒有簡單的方法來知道觀看者的PID等待它退出,除非做一些不便攜的詭計。

一個解決方案可能是使用模塊File::Temp(包含在perl發行版中)並使用UNLINK/CLEANUP標誌創建臨時文件/目錄,以便在持有對象的變量超出範圍時刪除它(因此調用DESTROY方法)。這樣,只要腳本運行(並且變量沒有超出範圍),臨時文件就可以在文件系統中訪問。

相關問題