据我所知,.desktop
文件是允许自定义应用程序设置的快捷方式。例如,我的/usr/share/applications/
文件夹中有很多。
如果我在 中打开该文件夹nautilus
,只需双击其关联文件即可运行这些应用程序,例如双击firefox.desktop
运行 Firefox。但是,我找不到通过终端做同样事情的方法。
如果我这样做gnome-open foo.desktop
,它只是foo.desktop
作为文本文件打开。如果我让它可执行然后在 bash 中运行它,它就会失败(这是预期的,它显然不是 bash 脚本)。
编辑:即使我将所有权更改为自己,这样做也会exec /fullpath/foo.desktop
给我一个信息。Permission denied
如果我制作可执行文件并执行相同的命令,我正在使用的终端选项卡就会关闭(我猜它会崩溃)。最后,如果我这样做sudo exec /fullpath/foo.desktop
,我会收到错误报告sudo: exec: command not found
。
这是我的问题,如何foo.desktop
从终端运行文件?
gtk-启动
使用任何支持的最新 Ubuntu
gtk-launch
只需简单地带有或不带有该部分
<file>
的文件的名称在哪里。名称不得包含完整路径。.desktop
.desktop
该
.desktop
文件必须位于/usr/share/applications
或/usr/local/share/applications
中~/.local/share/applications
。所以
gtk-launch foo
打开/usr/share/applications/foo.desktop
(或foo.desktop
位于其他允许的目录之一。)从
gtk-launch
文档:可从终端使用或Alt + F2(Alt + F2将命令存储在历史记录中,以便轻松访问)。
答案应该是
但由于一个错误(此处为上游,于 2020 年 12 月 9 日关闭),这不再有效。
现代答案
gtk-launch <app-name>
-<app-name>
文件的文件名在哪里.desktop
,有或没有.desktop
扩展名。有关更多详细信息, 请参阅此线程上的另一个答案。我从那个答案中得到了这个信息。
弃用的 shell 工具答案
很久以前写的 - 请参阅此答案下方的评论,了解为什么这种方法不适用于许多桌面文件。
运行的命令包含在桌面文件中,前面有,
Exec=
因此您可以通过以下方式提取和运行它:打破它
你可以把它放在一个文件中,比如
~/bin/deskopen
内容然后使其可执行
然后你可以做,例如
参数(
%u
等)在此处%F
详细说明。它们都与在命令行启动无关。虽然 OP 没有询问 KDE,但对于运行 KDE 的任何人,都可以使用以下命令:
kioclient exec <path-to-desktop-file>
在 Fedora 上,它包含在kde-runtime rpm 中。在 Arch 上,它位于kde-cli-tools(HT:@Aron Cederholm)中。
从glib 2.67.2 开始,有一个
gio launch
命令可以像这样使用:对于旧版本,我有一个快速的解决方法(从 nautilus 源代码中窃取灵感)。这有点令人费解,但在 Ubuntu 12.10 上完美运行,
?
在 Unity 启动器上添加了一个有意义的图标(不再是 )。首先,我使用 Gio 编写了一个 python 脚本并将其保存为
~/bin/run-desktop
:该脚本需要具有可执行权限,所以我在终端中运行了它:
然后我在以下位置创建了相关
.desktop
条目~/.local/share/applications/run-desktop.desktop
:~/.local/share/applications/mimeapps.list
最后,我将条目作为该部分下的默认处理程序关联[Default Applications]
为:现在:
xdg-open
something.desktop 按预期工作#!/usr/bin/xdg-open
可执行桌面条目顶部的 hashbang 也可以正确的方式
gtk-launch
如果它可用,你真的应该使用它。它通常是软件包libgtk-3-bin的一部分(这可能因发行版而异)。gtk-launch
使用如下:请注意,
gtk-launch
需要安装.desktop文件(即位于/usr/share/applications
或中~/.local/share/applications
)。所以为了解决这个问题,我们可以使用一个 hackish 的小 Bash 函数,在启动它之前临时安装所需的.desktop文件。安装.desktop文件的“正确”方法是 via,
desktop-file-install
但我将忽略它。您可以像这样使用它(如果需要,还可以传递其他参数或 URI):
手动替代方案
如果要手动解析和执行.desktop文件,可以使用以下
awk
命令:如果您想将
awk
命令视为一体式脚本;如果找不到Exec命令,我们甚至可以显示错误消息并以返回码 1 退出:上述命令将:
%f
,%u
,%U
)。可以按照规范的意图将这些替换为位置参数,但这样做会大大增加问题的复杂性。请参阅最新的桌面条目规范。请注意,此 AWK 脚本解决了一些边缘情况,这些情况可能会或可能不会被其他一些答案正确解决。具体来说,该命令会删除多个Exec变量(注意不要以其他方式删除 % 符号),只会执行单个Exec行命令,并且即使Exec行命令包含一个或多个等号(例如
script.py --profile=name
),也会按预期运行。只是其他一些警告......根据规范,TryExec是:
考虑到这一点,执行它的价值是没有意义的。
其他一些问题是Path和Terminal。路径由运行程序的工作目录组成。终端是一个布尔值,指示程序是否在终端窗口中运行。这些都可以解决,但是重新发明轮子没有意义,因为已经有规范的实现。如果您确实想实现Path,请记住它会
system()
产生一个子进程,因此您不能通过执行类似system("cd \047" working_directory "\047"); system(command)
. 但是,您大概可以执行类似system("cd \047" working_directory "\047 && " command)
. 注意 \047 是单引号(因此该命令不会在带有空格的路径上中断)。Python 替代方案
我在这里从 Carlo 那里偷了一个页面,他建议创建一个 Python 脚本来使用gi模块。这是从 shell 执行相同代码而无需创建文件和担心 I/O 的最小方法。
然后执行launcher函数如下:
请注意,URI 的使用是可选的。此外,不执行错误检查,因此如果您希望脚本持久,您需要确保启动器存在并且可读(在使用之前)。
你可以使用dex。
安装 dex:
用它运行文件:
如果安装了 exo-utils 似乎可以在 13.10 版本中使用(就像 Xubuntu 的情况一样)。
(从这里的各种其他答案编译)
根据您的系统以及系统上可能存在或不存在的各种错误,请尝试以下操作,直到其中一个有效:
xdg-open program_name.desktop
exo-open program_name.desktop
[我的首选,只要它有效]gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop
grep
在 *.desktop 文件中搜索Exec=
包含要执行的命令的行,删除我们不需要的行的部分,然后执行它。它写得很好,适用于大多数桌面文件。请参阅他的答案以获得完整的解释。请注意,在 Ubuntu 系统上,您的“开始菜单”桌面启动器在
/usr/share/applications/
.例如,为了显示上述哪些命令在我的 Ubuntu 14.04 系统上有效或无效,以下是对我的以下调用的结果:
xdg-open /usr/share/applications/eclipse_for_cpp.desktop
# 由于错误而失败(试图让我保存这个 .desktop 文件)exo-open /usr/share/applications/eclipse_for_cpp.desktop
# 工作gtk-launch /usr/share/applications/eclipse_for_cpp.desktop
# 失败,“gtk-launch: no such application”kioclient exec /usr/share/applications/eclipse_for_cpp.desktop
# 工作dex /usr/share/applications/eclipse_for_cpp.desktop
# 失败,&sudo apt install dex
找不到包 dex$(grep '^Exec' /usr/share/applications/eclipse_for_cpp.desktop | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g') &
# 工作哈米什答案的附录。
给定 desktopopen 脚本,您可以使用对它的引用作为.desktop文件中的 shebang 行,因为注释字符仍然是
#
. 也就是说,把这个作为.desktop文件的第一行:然后将.desktop文件标记为可执行文件(例如使用 a
chmod +x whatever.desktop
),然后您可以瞧——应用程序将打开!(完成我指定的图标文件,虽然我不知道如何。)
现在,如果您还希望deskopen 传递任何命令行参数,您可以改用这个稍作修改的版本:
顺便说一句,我尝试使用
"#{@:2}"
而不是shift
ing,但它一直给我“糟糕的替代”......