Terminal
在終端外執行程序
我正在嘗試啟動一個終端以互動方式請求文件,並使用 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
)。
後台流程:
- 與終端分離(
setsid
);- 執行
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" &'