在后台启动程序时 xdg-open 出现异常

在后台启动程序时 xdg-open 出现异常

到目前为止,我一直使用 xdg-open 的别名。

alias o='xdg-open $@ 2> /dev/null'

xdg-open 的默认行为是在当前所选终端的前台启动进程,因此打开与 vim 关联的文件(通过 xdg-mime)会导致在输入命令的终端中打开编辑器。

问题是,虽然打开基于终端的程序(如 mutt 和 vim)工作正常,但例如 .html 文件在默认浏览器中打开,而我的终端窗口变得不可用,因为进程在前台运行并等待文件关闭。

我创建了下面的函数,以便我可以从当前使用的终端打开文件,并且仍然能够在同一窗口中工作。

function o(){ xdg-open $@ 2> /dev/null & }

它解决了我的问题,但现在打开例如与 vim 关联的文件会导致向我显示 PID,并且我必须输入 $ fg 才能访问编辑器。

我尝试编辑 vim.desktop 条目,以便它至少可以在新终端中启动,但我认为这是一个非常糟糕的解决方法。有人可以告诉我如何正确解决这个问题吗?先感谢您。

答案1

xdg-open旨在运行查看器程序并等待其完成。它不是为在后台运行而设计的,而且正如您所发现的,它不太可能工作得很好。对于旧的 mailcap 系统也会遇到同样的问题,它也在前台运行程序。

可以将 shell 函数更改为始终在新终端中打开,但这可能会导致您拥有大量无用的终端。为了使你的函数更有用并且更像你想要的那样工作,你可以做的是这样做:

o () {
    for i in "$@"
    do
        mimetype=$(xdg-mime query filetype "$i")
        prog=$(xdg-mime query default "$mimetype")
        if grep -qs Terminal=true "/usr/share/applications/$prog"
        then
            xdg-open "$i"
        else
            xdg-open "$i" >/dev/null 2>/dev/null &
        fi
    done
}

这将查看您的程序是否需要终端,如果需要,将在前台调用它;否则,它将在后台调用它。但是,目前它不处理 URL 或自定义应用程序,您需要对其进行适当编辑以使您的系统能够处理这些问题。尽管如此,它仍然是您可以继续发展的起点。

相关内容