Terminal

在終端外執行程序

  • October 14, 2022

我正在嘗試啟動一個終端以互動方式請求文件,並使用 GUI 程序打開它:

foot /bin/sh -c 'file=`fzf`;(setsid xdg-open "$file" &)'

我正在使用setsid,因為否則終端在xdg-open退出時會刪除它。但是,上面的命令不起作用:它仍然退出,螢幕上沒有顯示任何內容。但是,當我sleep在最後添加 a 時,它確實有效:

foot /bin/sh -c 'file=`fzf`;(setsid xdg-open "$file" &); sleep 0.0000000001'

終端退出,但由 啟動的程序xdg-open仍在執行。

這裡發生了什麼?有沒有更清潔的方法可以避免睡眠(因為我假設睡眠的確切時間取決於系統)。

我嘗試使用disown,但這根本不起作用(即使使用sleep)。

後台流程:

  1. 與終端分離(setsid);
  2. 執行xdg-open

如果終端在步驟 1 完成之前就消失了,整個程序組會收到一個 SIGHUP 並被殺死。setsid阻止 SIGHUP 到達xdg-open,但是如果setsid(或正在呼叫的子shell )在完成其工作setsid之前被殺死,則無濟於事。setsid

解決方法是在前台從 SIGHUP 中分離。

foot /bin/sh -c 'file=`fzf`; setsid sh -c "xdg-open \"\$1\" &" sh "$file"'

另一種解決方案是忽略 SIGHUP。

foot /bin/sh -c 'file=`fzf`; trap "" SIGHUP; xdg-open "$file" &'

引用自:https://unix.stackexchange.com/questions/721021