据我所知,.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文件?

评论

注意:exec失败的原因是因为exec用您指定的进程替换了当前正在运行的进程,所以您所做的就是尝试通过将桌面作为已编译的二进制文件运行来替换shell。之所以不能执行sudo exec是因为它是内置的Shell而不是二进制命令。

有趣的是,我想知道为什么它导致选项卡关闭。

相关:Gnome .desktop文件的Hashbang

我看到了,他们最终解析了.desktop文件。无论如何,谢谢您的链接。

#1 楼

现代答案
gtk-launch <app-name>-其中<app-name>.desktop文件的文件名,带或不带.desktop扩展名。
有关此详细信息,请参见此线程上的另一个答案。我从该答案中获得了此信息。
过时的shell工具答案
很久以前写的-请参阅此答案下方的注释,以了解为什么这种方法不适用于许多桌面文件。
运行的命令包含在桌面文件中,并以Exec=开头,因此您可以通过以下方式提取并运行该命令:
$(grep '^Exec' filename.desktop | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g') &

要分解此问题
grep  '^Exec' filename.desktop    - finds the line which starts with Exec
| tail -1                         - only use the last line, in case there are multiple
| sed 's/^Exec=//'                - removes the Exec from the start of the line
| sed 's/%.//'                    - removes any arguments - %u, %f etc
| sed 's/^"//g' | sed 's/" *$//g' - removes " around command (if present)
$(...)                             - means run the result of the command run here
&                                 - at the end means run it in the background

您可以将其放入在文件中,说~/bin/deskopen并包含内容
#!/bin/sh
$(grep '^Exec'  | tail -1 | sed 's/^Exec=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g') &

,然后使其可执行
chmod +x ~/bin/deskopen

然后您可以执行以下操作,例如
deskopen /usr/share/applications/ubuntu-about.desktop

参数( %u%F等)在此处详细说明。它们都与在命令行启动无关。

评论


到目前为止,这提供了最佳结果,但有时会产生不良行为。每当“ Exec =”行具有%u或%i之类的参数时,就会发生这种情况。 Bash尝试将该字符串作为常规参数传递。例如,执行grep'^ Exec'firefox.desktop | sed's / ^ Exec = //'将打开带有加载www。%u.com的选项卡的Firefox。

–马拉巴尔巴
10-10-4在15:18

目前,我添加了第二个sed以删除所有参数。但是我认为可能会有更“自然”的方式运行它。

–马拉巴尔巴
10-10-4在15:20

我用额外的sed更新了答案-我忘记了桌面文件可能包含参数。

–汉米·唐纳(Hamish Downer)
2010年10月4日在17:10

您应该在“ grep”之后的管道上添加“ tail -1”,因为“ Exec =“可以多次出现,然后,只能执行最后一次出现。

–雏菊
2012年4月28日6:20



-1:这可能适用于简单的.desktop文件,但它会忽略可能会影响执行的Path =和TryExec =之类的条目。如果文件包含桌面操作(“快速列表”),它还会执行错误的Exec =。

–MestreLion
13年5月23日在0:36

#2 楼

gtk-launch
只需使用最新的支持gtk-launch的Ubuntu,就可以轻松使用
gtk-launch <file>

,其中<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文档开始:

gtk-launch使用给定名称启动应用程序。除非另有说明,否则应用程序将在默认的显示器上以正确的启动通知启动。
gtk-launch至少使用一个参数,即要启动的应用程序的名称。该名称应与/ usr / share / application中驻留的应用程序桌面文件名匹配,带有或不带有'.desktop'后缀。

可从终端或Alt + F2(Alt + F2存储命令)使用在历史上很容易访问)。

评论


这就是方法,也可以在debian中工作。

–user77164
15年2月13日在17:51

gtk-launch firefox.desktop〜/ .local / share / applications /为我启动firefox,查看目录〜/ .local / share / applications /。似乎正确无误,因此不应将.desktop文件的目录作为参数传递给firefox。实际上,传递给gtk-launch的目录不应该用于查找包含.desktop文件的目录(实际上不是)

–狼山路
2015年2月28日在16:35



在Ubuntu 18.10上,没有适用于我的版本。每当它抱怨该应用程序不存在时,无论我是否位于桌面文件所在的文件夹中,是否包括.desktop扩展名,以及是否分别命名目录。

–约瑟夫·加文
18/12/7在7:29

那完全是毫无意义的。唯一真正的意义是启动用户制作的.desktop启动器。如果您的应用程序位于/ usr / local / share / applications中,则只需在终端中键入应用程序的名称即可。

–tatsu
19年3月31日在17:50

@JosephGarvin好的,我知道了,这是gtk推出的MYCUSTOMAPP.desktop,没有路径。在Ubuntu 18.10上工作

–tatsu
19年3月31日在17:54

#3 楼

答案应该是

xdg-open program_name.desktop


但是由于存在错误(在上游),因此不再有效。

评论


哇,这仍然是一个bug,在xdg中有很多进展。 exo-open被列为解决方法,它也可以打开gedit。 :(

–提请
2011-10-17 17:59



“不再有效”?从来没有! xdg-open通过mimetype关联进行工作,并且.desktop文件与文本编辑器相关联,因为它们是文本的子类

–MestreLion
13年5月23日在0:47

这太愚蠢了(以至于没有明智的方法可以从终端运行桌面文件)

–山姆·沃特金斯(Sam Watkins)
14年6月21日在4:23

在Arch Linux上为我工作,但也许是Ubuntu特有的错误。

–维克多
17年5月11日在12:29

目前,这在Arch Linux中对我不起作用。 xdg-open program_name.desktop在文本编辑器中打开桌面文件。

–MountainX
18年11月29日在19:41

#4 楼

该错误自2006年以来仍然存在。实际上取决于gvfs-open(称为xdg-open)的工作方式。
我还是设法进行了快速解决(从nautilus源代码中窃取灵感)。它有点令人费解,但是在Ubuntu 12.10上可以完美工作,在Unity启动器上添加了一个有意义的图标(不再添加?)。
首先,我使用Gio编写了一个python脚本,并将其保存为~/bin/run-desktop: >
 #!/usr/bin/python

from gi.repository import Gio
import sys 

def main(myname, desktop, *uris):
    launcher = Gio.DesktopAppInfo.new_from_filename(desktop)
    launcher.launch_uris(uris, None)

if __name__ == "__main__":
    main(*sys.argv)
 

该脚本需要具有可执行权限,因此我在终端中运行了此脚本:
chmod +x ~/bin/run-desktop

然后我在.desktop上创建了相对的~/.local/share/applications/run-desktop.desktop条目:
[Desktop Entry]
Version=1.0
Name=run-desktop
Exec=run-desktop %U
MimeType=application/x-desktop
Terminal=false
Type=Application

最后,我将该条目作为~/.local/share/applications/mimeapps.list[Default Applications]部分下的默认处理程序关联为:
[Default Applications]
....
application/x-desktop=run-desktop.desktop

现在:


xdg-open something.desktop可以按预期工作

#!/usr/bin/xdg-open
在可执行的桌面条目顶部的hashbang也可以工作

gvfs-open将解决该错误时无用的工作,但与此同时...

评论


这比Hamish Downer的答案更好,因为它将正确处理命令中的多个Exec =行和%参数。

– Flimm
13年1月11日在9:31

谢谢你的代码-我在Lucid上,我只是将其保存为/ usr / bin / xdg-openpy,并给它一个chmod + x-并使用launcher.launch([],context)代替了...无,上下文)(由于“ TypeError:参数1:必须为序列,而不是NoneType”)。现在,xdg-openpy app.desktop可从命令行运行(并且双击app.desktop时一切正常),如果我尝试在终端xdg-open中调用并按tab,它可以提醒我。干杯!

– sdaau
13年2月12日在19:40

+1。这是不需要手动解析.desktop文件的唯一答案,因此这是最明智(也是最安全)的方法。还使用了现代gi.repository而不是不推荐使用的pygtk,太好了! :)

–MestreLion
13年5月23日在0:39



实际上,这是关于卡洛·佩莱格里尼的答案的问题。我是新人,如果有更好的放置方法,请纠正我。该脚本确实运行良好,但是我在Unity启动器上看到的图标不是.desktop文件中定义的图标,而是'Exec'ed命令的默认图标。有什么想法吗?

– Ingo Leonhardt
2013年5月24日14:23



@Noitidart写了最后一个答案,导致Mo做了一些Google,我发现了。还没有检查出来,但是也许有帮助

– Ingo Leonhardt
15年3月5日,12:36

#5 楼

正确的方法

如果可用,您应该真正使用gtk-launch。它通常是libgtk-3-bin软件包的一部分(可能因发行版而异)。

gtk-launch的用法如下:



 gtk-launch APPLICATION [URI...]
gtk-launch app-name.desktop
gtk-launch app-name
 


请注意,gtk-launch需要安装.desktop文件(即,位于/usr/share/applications~/.local/share/applications中)。

因此,为了解决这个问题,我们可以使用一个有点黑的Bash函数,该函数会在启动之前临时安装所需的.desktop文件。安装.desktop文件的“正确”方法是通过desktop-file-install,但是我将忽略它。

 launch(){

    # Usage: launch PATH [URI...]

    # NOTE: The bulk of this function is executed in a subshell, i.e. `(..)`
    #       This isn't strictly necessary, but it keeps everything
    #       out of the global namespace and lessens the likelihood
    #       of side effects.

    (

    # where you want to install the launcher to
    appdir=$HOME/.local/share/applications

    # the template used to install the launcher
    template=launcher-XXXXXX.desktop

    # ensure  has a .desktop extension, exists, is a normal file, is readable, has nonzero size
    # optionally use desktop-file-validate for stricter checking
    # desktop-file-validate "" 2>/dev/null || {
    [[  = *.desktop && -f  && -r  && -s  ]] || {
        echo "ERROR: you have not supplied valid .desktop file" >&2
        return 1
    }

    # ensure the temporary launcher is deleted upon exit
    trap 'rm "$launcherfile" &>/dev/null' EXIT

    # create a temp file to overwrite later
    launcherfile=$(mktemp -p "$appdir" "$template")

    launchername=${launcherfile##*/}

    # overwrite temp file with the launcher file
    if cp "" "$launcherfile" &>/dev/null; then
        gtk-launch "$launchername" "${@:2}"
    else
        echo "ERROR: failed to copy launcher to applications directory" >&2
        return 1
    fi

    )

}
 


可以像这样使用它(如果需要,还可以传递其他参数或URI):

 launch PATH [URI...]
launch ./path/to/shortcut.desktop
 



替代方法

如果要手动解析并执行.desktop文件,则可以使用以下awk命令执行: br />
 awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system(awk)}' app-name.desktop
 


如果要将awk 'BEGIN {command=""} /^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); command=%f; exit} END {if (command!="") {exit system(command)} else {if (FILENAME == "-") {printf "ERROR: Failed to identify Exec line\n" > "/dev/stderr"} else {printf "ERROR: Failed to identify Exec line in 7%s7\n", FILENAME > "/dev/stderr"} close("/dev/stderr"); exit 1}}' 命令当作一个多脚本来处理;如果找不到Exec命令,我们甚至可以显示错误消息并以返回码1退出:

 %u 


上述命令将:


查找以Exec =

开头的行删除Exec =

删除所有Exec变量(例如%Uscript.py --profile=namesystem())。可以按照规范的意图用位置参数替换这些参数,但是这样做会大大增加问题的复杂性。请参阅最新的桌面进入规范。
执行命令
立即以适当的退出代码退出(以免执行多条Exec行)

请注意,此AWK脚本处理了一些其他情况可能无法解决的极端情况。具体来说,此命令删除多个Exec变量(注意不要以其他方式删除%符号),将仅执行一个Exec行命令,即使Exec行命令包含一个或多个等号(例如system("cd 7" working_directory "7"); system(command)),其行为也将与预期的一样。

其他一些警告...根据规范,TryExec为:


磁盘上的可执行文件的路径,用于确定程序是否已实际安装。如果该路径不是绝对路径,则在$ PATH环境变量中查找该文件。如果文件不存在或不是可执行文件,则该条目可能会被忽略(例如,不在菜单中使用)。


请记住,它不会执行它的值很有意义。

其他一些问题是路径和终端。 Path由运行程序的工作目录组成。Terminal是一个布尔值,指示程序是否在终端窗口中运行。所有这些都可以解决,但是重新定义轮子没有意义,因为已经有该规范的实现。如果确实要实现Path,请记住system("cd 7" working_directory "7 && " command)会生成一个子进程,因此您无法通过执行launch(){ # Usage: launch PATH [URI...] python - "$@" <<EOF import sys from gi.repository import Gio Gio.DesktopAppInfo.new_from_filename(sys.argv[1]).launch_uris(sys.argv[2:]) EOF } 之类的操作来更改工作目录。但是,您大概可以执行类似launch ./path/to/shortcut.desktop 的操作。注意\ 047是单引号(因此命令不会在带有空格的路径上中断)。

Python替代品

我从Carlo那里窃取了一个页面,建议创建一个Python脚本以使用gi模块。这是从外壳执行相同代码而无需创建文件而不必担心I / O的最小方法。

 q4312079q  

,然后执行启动器功能,如下所示:

 q4312079q 


请注意,URI的使用是可选的。另外,不执行任何错误检查,因此,如果要使脚本具有持久性,则要确保启动器存在并且可读(在使用前)。

评论


但是awk命令很好。因此+1

– A.B.
15年8月21日在19:40

在这种情况下,什么是URI?我在任意文件夹中都有一个桌面文件。我如何直接对它运行gtk-launch而不必将其包装在其他脚本中呢?这太疯狂了。

–约瑟夫·加文
18/12/7在7:30



如果命令具有两次转义的空格或反斜杠,则此awk解决方案将无法正常工作。它在此中断:Exec = env WINEPREFIX =“ / path / to / .wine” wine c:\\\\ windows \\\\ command \\\\ start.exe / Unix /path/to/.wine/dosdevices / c:/ users / Public /Рабочий\\стол/ appname.lnk和dex解决方案工作正常。

– MarSoft
19年3月8日在17:15

#6 楼

尽管OP并未询问KDE,但对于正在运行KDE的任何人,都可以使用以下命令:

kioclient exec <path-to-desktop-file>

在Fedora上,它包含在kde-runtime rpm中。 br />

评论


已投票,因为它有效。只要安装了此程序,就完全不需要运行KDE。

–basic6
15年2月12日在19:24

有没有办法对此有标准?我已经编译了克莱门汀播放器,该播放器存在一个错误,该错误仅通过.desktop文件(带有plasma-shell)启动时才会发生。而且我不知道如何输出日志。

– Kwaadpepper
2015年11月16日14:22

@Kwaadpepper,您可以使用.desktop文件启动外壳程序脚本,该脚本在内部运行命令并将输出重定向到文件。

–拉曼
15年11月18日在8:03

目前,我在任何适用于Arch Linux的KDE软件包中都找不到kioclient。但是,gtk-launch在我的KDE下工作。

–MountainX
18年11月29日在19:49

kioclient5 exec〜/ .local / share / applications / myprogram.desktop在Kubuntu 20.04上为我工作

–极客
20-10-30在2:52

#7 楼

您可以使用dex。

dex foo.desktop


评论


恕我直言,这是正确的答案:一个工具,仅以文件为参数的单个调用。我也正在寻找测试手写的.desktop文件。而且它也可以创建.desktop文件! :-)

–阿克塞尔·贝克特(Axel Beckert)
16年7月31日在15:42

完善!如果您将使用dex gist.github.com/stuaxo/4169fc1342c496b7c8f7999188f2f242的dex文件添加到/ usr / share / applications /中,则默认情况下也可以在文件管理器中启动桌面文件而无需在gedit中打开它们。

– Stuart Axon
16/12/19在11:47

而已!滚动过多无法找到正确的答案...

–ricab
20-4-3在22:34

适用于20.04。

–耿鹏和
20年5月8日在17:32

#8 楼

exo-open [[path-to-a-desktop-file]...]


如果已安装exo-utils,似乎可以在13.10版本中工作(就像Xubuntu一样)。

评论


是的,刚刚在Ubuntu Studio 14.04中对其进行了测试。顺便说一句。 xdg-open和gvfs-open也在那里工作。

– jarno
14-10-28在16:53

同样适用于15

–乔纳森
15年5月2日在18:25

在xfce中使用Debian。很棒!

– king_julien
17年4月23日在14:58

在Ubuntu 14.04中为我工作

–泰勒·科利尔(Tyler Collier)
18/12/15在20:38

#9 楼

Hamish的答案的附录。

鉴于deskopen脚本,您可以将其引用用作.desktop文件中的shebang行,因为注释字符仍为#。也就是说,将其作为.desktop文件的第一行:

#!/usr/bin/env deskopen


然后将.desktop文件标记为可执行文件(例如,带有chmod +x whatever.desktop),然后那么您可以

path/to/whatever.desktop


和voilà-该应用程序将打开! (虽然我不知道如何完成,但仍完成了我指定的图标文件。)

现在,如果您还希望deskopen传递任何命令行参数,则可以改用此版本:

#!/bin/sh
desktop_file=
shift
`grep '^Exec' "${desktop_file}" | sed 's/^Exec=//' | sed 's/%.//'` "$@" &


顺便说一句,我尝试使用"#{@:2}"而不是shift ing,但是它一直给我“不好的替代品” ...

评论


我知道这更适合对Hamish的答案发表评论,但是我是新用户,并且不允许发表评论。那好吧!

–pabst
2012年2月9日在20:14

如果您享有声誉,那么最合适的操作实际上就是编辑该答案。

– Flimm
2012年9月13日在12:58

提醒您,任何人都可以建议编辑内容,甚至包括尚未登录的用户!没什么大不了的。

– Flimm
13年1月11日,9:33

这本身就是一个答案,很好。

–布鲁诺·佩雷拉(Bruno Pereira)
13年1月11日,9:34

您可以使用“ $ {@:1}”而不是shift,但这需要bash代替#中的sh!社bang恕我直言,您原来的轮班方法更简单,更好

–MestreLion
2013年5月23日1:00



#10 楼

当前没有一个应用程序可以执行您在Ubuntu档案中描述的操作。正在努力进行一些工作,以创建一个通用解决方案,以为不符合这些XDG规范的桌面环境(如openbox)提供集成。

Arch Linux正在研究xdg-autostart的实现。基于python-xdg库。据我发现,这似乎还没有完全完成,但是有一些成功的报告。

在gitorious(http://gitorious.org/xdg -autostart /),可能会受益于更广泛的使用。

如果任何一种解决方案都适合您,请考虑提交必要的工作以将其包含在Debian或Ubuntu中。

如果将这两种工具与openstart一起使用,则可以在/etc/xdg/openbox/autostart.sh中调用它(如果我正确阅读了openbox文档)。如果这不起作用,则可以在任何openbox会话初始化脚本中调用它。

评论


无论如何我都不愿听到,谢谢您的信息

– Enzotib
2011年7月6日在16:09

#11 楼

我没有满足“使用标准命令”要求的立即解决方案,但是如果您确实想最少地解析.desktop文件或想要创建Bash别名,那么以下方法应该起作用:

可能有趣的另一种方法是创建一个内核级的awk -F= '/Exec=/{system(); exit}' foo.desktop方法,而不是在binfmt-misc文件上进行匹配(有关当前启用的模式,请参见.desktop)。

归根结底,某些地方将不得不解析grep -r . /proc/sys/fs/binfmt_misc/文件,这只是“标准/默认”设置的问题。

评论


谢谢,有趣。作为“标准”,我指的是DE提供的并符合freedesktop.org的内容。

– Enzotib
2011年7月10日在8:48

支持awk,而不是一连串的抱怨和烦恼。

– jmtd
13-10-21在10:57

如果您有多个Exec =行,则支持Upvote,尽管它不起作用(或者更好地放置-太多了):

– Boris Churzin
17年4月4日在9:46

#12 楼

(根据此处的其他答案进行编译)

取决于您的系统以及系统上可能存在或可能不存在的各种错误,请尝试以下操作,直到其中一个起作用为止:


xdg-open program_name.desktop
exo-open program_name.desktop
gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop

请注意,在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#Works

gtk-launch /usr/share/applications/eclipse_for_cpp.desktop#失败带有“ gtk-launch:无此类应用程序”

kioclient exec /usr/share/applications/eclipse_for_cpp.desktop#作品

dex /usr/share/applications/eclipse_for_cpp.desktop#失败,并且sudo apt install dex无法找到软件包dex


#13 楼

我从上述Carlo的答案中摘取了脚本,并尝试对其进行改进以供我自己的桌面使用。

此版本的脚本将允许您运行任何应用程序,就像在HUD上输入它一样,只要它可能是第一个结果即可。它还允许您传递不支持URI的.desktop文件的文件参数。

 #!/usr/bin/env python

from gi.repository import Gio
from argparse import ArgumentParser
import sys, os

def find_app(search_string):
    for group in Gio.DesktopAppInfo.search(search_string):
        for entry in group:
            try:
                return Gio.DesktopAppInfo.new(entry)
            except: pass
    return None

def main(args):
    launcher = None
    if os.path.isfile(args.appName):
        try:
        # If it's a file, do that first.
            launcher = Gio.DesktopAppInfo.new_from_filename(args.appName)
        except TypeError:
            print "'" + args.appName + "' is not a .desktop file"
            sys.exit(-1)
    # If it's a .desktop file in the DB, try using that
    if launcher is None and args.appName.endswith('.desktop'):
        try:
            launcher = Gio.DesktopAppInfo.new(args.appName)
        except TypeError: pass

    if launcher is None:
        # Search for the app by the text given
        launcher = find_app(args.appName)

    if launcher is None:
        print "No app named " + args.appName + " could be found"
        sys.exit(-1)
    if (launcher.supports_uris()):
        launcher.launch_uris(args.uris, None)
    elif (launcher.supports_files()):
        launcher.launch(list({ Gio.File.parse_name(x) for x in args.uris }), None)
    else :
        launcher.launch()

if __name__ == "__main__":
    argParser = ArgumentParser(description="Launch a .desktop file or application")
    argParser.add_argument("appName", 
        help="the name of any application, a desktop file's basename, or a concrete path to a desktop file", 
        action='store'
    )
    argParser.add_argument("uris", 
        nargs='*', 
        help="Files or URIs to pass to the application"
    )
    args = argParser.parse_args()
    main(args)
 


#14 楼

尝试测试这些文件时,我发现检查DM或会话管理器是否可以执行我期望的最简单方法是在UI文件夹浏览器中打开周围的目录,然后双击以打开它们。

如果您在命令行中:gvfs-open .gnome-open .将在已配置的文件夹浏览器中打开它。真的不想要其他行为。它不是命令行,但确实可以验证内容。我还发现设置Terminal=true对于调试很有用。

评论


终端立即消失,使用Terminal = true时我没有时间看消息:

–gouessej
15年10月29日在11:53

#15 楼

这样的答案对我来说很清楚:不要尝试执行桌面文件,不要执行桌面文件中指向的文件。

例如,执行/ home / jsmith / Desktop / x11vnc.sh

Exec=/home/jsmith/Desktop/x11vnc.sh


#16 楼

Hamish的答案很好,但我想提出一个更简单的选择,涉及更少的管道:

$(awk -F= '/^Exec/||/^TryExec/ {print ;exit}' /usr/share/applications/firefox.desktop)

在这种情况下,awk搜索以Exec开头的行,并且然后我们仅在该行之后打印字段,使用for循环和=我们打印字段2,即该字段之后的内容。命令末尾的大括号$(...)是参数替换,因此shell将执行awk命令返回的所有内容;在这种情况下,它将返回Exec=之后的实际命令。

在极少数情况下,可能会出现多个=标志,但仍有可能。为此,我建议

$(awk -F= '/^Exec/||/^TryExec/ {for(i=2;i<=NF;i++) print $i;exit}' /usr/share/applications/firefox.desktop)


评论


不错,awk和Serg =)

– A.B.
15年8月21日在19:56

有时,有一个TryExec,也许您应该检查第二条命令=)

– A.B.
15年8月21日在19:57



@ A.B。呵呵,awk是我在文本处理方面的首选武器。此外,它的语法接近于C。哦,已经添加了TryExec部分^ _ ^

– Sergiy Kolodyazhnyy
15年8月21日在19:59

你有我的+1 =)

– A.B.
2015年8月21日在20:00

但是%f,%u,%U或类似的命令后面是什么?

– A.B.
15年8月21日在20:01

#17 楼

确保您的桌面文件指向的脚本也是可执行的。

如果仍然不起作用。通过更改Terminal=true使桌面文件在终端中可运行,并将其放在bash脚本中。运行脚本以捕获错误输出。更正错误后请改回来。