我正在尝试启动一个终端以交互方式请求文件,并使用 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 中分离。
另一种解决方案是忽略 SIGHUP。