KDE 菜单编辑器写入了不应出现在命令中的引号

KDE 菜单编辑器写入了不应出现在命令中的引号

当我尝试将新的应用程序启动器/图标添加到 Kubuntu 中的启动器菜单列表或编辑现有启动器/图标时,我注意到了这个问题几次。

.desktop在某些情况下,只有在我手动编辑了相应的文件并确保命令正确后,引号才会出现在 KDE 菜单编辑器中Exec=。在这种情况下,命令的执行没有问题,启动器可以正常工作。

例如,我有一个~/.local/share/applications/software-properties-qt.desktop包含以下行的文件Exec=pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true software-properties-qt,它工作正常。但 KDE 菜单编辑器或应用程序启动器右键单击菜单选项“编辑应用程序”显示以下内容:

env 'DISPLAY=$DISPLAY' 'XAUTHORITY=$XAUTHORITY' KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true software-properties-qt

在此处输入图片描述

但在某些情况下当我尝试使用 KDE 菜单编辑器创建新的启动器时,没有使用任何引号,但.desktop文件中仍然创建了这些引号,结果很糟糕,我必须.desktop手动修改文件并删除引号。

例如,打开 KDE 菜单编辑器并创建一个新的条目/启动器,用于使用简单的命令在 VLC 中播放插入的 DVD vlc dvd://

在此处输入图片描述

它不起作用,因为在文件中~/.local/share/applications/VLC DVD.desktop创建了以下行,这看起来不正确:Exec='vlc dvd://'。这不起作用。


这是另一个例子:

apper如果简单地以如下方式启动 Apper 软件管理器(其安装的启动器中的默认命令),则无法正常使用/usr/share/applications/org.kde.apper.desktop,因为它无法获取所需的权限并在最后给出错误:

在此处输入图片描述

我发现有效的方法是使用这个命令:

pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true apper

它需要在开始时输入密码,然后才能按预期工作。

对于该命令,我创建了一个新文件~/.local/share/applications/org.kde.apper.desktop

当我在 Kate 文本编辑器中打开文件时,该Exec=行后面跟着如上所示的命令。但是当我使用 KDE 菜单编辑器或应用程序启动器小部件中的“编辑应用程序”上下文菜单选项时,我看到了此命令:pkexec env 'DISPLAY=$DISPLAY' 'XAUTHORITY=$XAUTHORITY' KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true apper

在此处输入图片描述

在此处输入图片描述


在此处输入图片描述

在此处输入图片描述

“为什么那里有引号”本身就是一个问题,纯粹是出于好奇而问的(假设应用程序运行良好),如果不是因为如果我尝试在 KDE 菜单编辑器中创建一个新条目,在这种情况下,为了以更新模式启动 Apper(apper --updates),通过简单地复制 Apper 的正确命令并添加--updates参数,结果不起作用,尽管 KDE 菜单编辑器中两个条目之间的唯一区别就是该参数。

好吧,在终端中测试该行(如在菜单编辑器中所示),它不起作用:

pkexec env 'DISPLAY=$DISPLAY' 'XAUTHORITY=$XAUTHORITY' KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true apper
qt.qpa.xcb: could not connect to display $DISPLAY
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, xcb.

Aborted (core dumped)

那么,为什么应用程序 Apper 可以工作,而从应用程序启动器 (kickoff、krunner) 启动时,新条目“使用 Apper 更新”却不工作呢?因为它们Exec=在相应.desktop文件中的实际行~/.local/share/applications不同:只有通过 KDE 菜单编辑器新创建的菜单(用于 Apper 中的更新) — 与旧菜单(用于启动 Apper)不同 — 包含引号,尽管在菜单编辑器中两者都有引号

我必须手动编辑文件~/.local/share/applications/Update with Apper.desktop并删除引号才能使其工作,即更改以下内容:

Exec=pkexec env 'DISPLAY=$DISPLAY' 'XAUTHORITY=$XAUTHORITY' KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true apper --updates

变成这样:

Exec=pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true apper --updates

只要逗号出现在菜单编辑器中但不出现在.desktop文件本身中,就可以使用逗号。

但为什么它们会出现在那里?这一切是如何运作的?

答案1

我不知道这到底是为什么(我会问一个新问题在此基础上),但这里具有决定性作用的是 KDE 菜单编辑器为程序及其参数提供了单独的条目,并且必须在那里分离命令才能将其正确写入文件中.desktop

Exec='vlc dvd://'您可以通过在菜单编辑器中使用正确的行编辑 VLC-DVD 启动器来验证这一点:

在此处输入图片描述

看来在 KDE 菜单编辑器中,程序和参数必须插入到单独的行中。

另一个 Apper 示例的问题更加复杂。在我看来,问题不在于引号(为什么它们出现在菜单编辑器中而不是文件中,这将是新问题的主题),而在于命令了解最新动态Apper 不仅涉及多个程序,还涉及多个参数。因此,只是为了推出 Apper正确使用所需的环境和管理权限,它pkexec在“程序”行和env 'DISPLAY=$DISPLAY' 'XAUTHORITY=$XAUTHORITY' KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true apper“命令行参数”行(apper这里也用作 CLI 参数)上工作正常。但仅仅--updates在菜单编辑器中添加该行是行不通的,可能是因为这是一个新参数(在已经存在的参数内!),因此触发了将错误的引号放在文件本身中的错误。这种情况对我来说仍然不清楚,因为在更正文件(删除引号)后,KDE 菜单编辑器显示的条目与之前不起作用的条目相同!(我希望在新问题中澄清这一点。菜单编辑器可能无法跟踪命令的一定复杂程度并在命令的一定复杂程度以上工作。)

无论如何,这个问题的答案 - 为什么启动器文件中有错误的引号 - 是由于菜单编辑器中的不当编辑:命令行应该在“程序”和“CLI 参数”字段之间拆分,最简单的解决方案是将其放在sh程序字段和-c 'THE REST OF IT ALL'参数字段中,或者简单地将命令放在脚本中,然后将脚本的路径添加到程序字段中。

— 根据@muru 的评论:

我期望sh -c 'pkexec env "DISPLAY=$DISPLAY" "XAUTHORITY=$XAUTHORITY" KDE_SESSION_VERSION=5 KDE_FULL_SESSION=true software-properties-qt'它适用于任何实现

由于在 Exec 字段中运行命令行时没有涉及任何 shell,因此您必须使用类似的方法sh -c 'pkexec ...'来使环境变量正确扩展,因此这里的命令将是sh,参数将是 -c 'pkexec ....或者只是将命令放在脚本中并执行该脚本

相关内容