我正在尝试打开一个终端以交互方式请求文件,并使用 GUI 程序打开它:
foot /bin/sh -c 'file=`fzf`;(setsid xdg-open "$file" &)'
我正在使用setsid
,因为否则终端xdg-open
退出时会删除它。然而,上面的命令不起作用:它仍然退出而不在屏幕上显示任何内容。但是,当我sleep
在末尾添加一个时,它做工作:
foot /bin/sh -c 'file=`fzf`;(setsid xdg-open "$file" &); sleep 0.0000000001'
终端退出,但启动的进程xdg-open
仍在运行。
这里发生了什么?有没有一种更干净的方法可以避免睡眠(因为我假设睡眠的确切时间取决于系统)。
我尝试使用disown
,但这根本不起作用(即使使用sleep
)。
答案1
后台进程:
- 与终端分离 (
setsid
); - 运行
xdg-open
。
如果终端在步骤 1 完成之前消失,则整个进程组会收到 SIGHUP 并被终止。setsid
阻止 SIGHUP 到达,但是如果(或调用调用的子 shell )在完成其工作之前被终止,xdg-open
这并没有帮助。setsid
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" &'