在终端外运行程序

在终端外运行程序

我正在尝试打开一个终端以交互方式请求文件,并使用 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

后台进程:

  1. 与终端分离 ( setsid);
  2. 运行xdg-open

如果终端在步骤 1 完成之前消失,则整个进程组会收到 SIGHUP 并被终止。setsid阻止 SIGHUP 到达,但是如果(或调用调用的子 shell )在完成其工作之前被终止,xdg-open这并没有帮助。setsidsetsidsetsid

修复方法是在前台与 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" &'

相关内容