在 .desktop EXEC 命令中获取当前路径

Kik*_*ksy 7 shell bash path .desktop

我试图让一个 .desktop 文件运行一个与 .desktop 存储在同一目录中的 .sh。整个目录需要可移植并在机器之间移动。

我的运行脚本是 run.sh

我试过了:

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
#Exec=sh -c "`dirname %k`/run.sh"
#Exec=bash -c "export PATH=$PATH:`dirname %k`; bash run.sh;"
#Exec=bash -c "export PATH=$PATH:`dirname %k`; sh run.sh;"
Exec=bash -c "export PATH=$PATH:`dirname %k`; run.sh;"
Run Code Online (Sandbox Code Playgroud)

但是当我双击 .desktop 文件时没有任何反应。如果我双击“run.sh”并选择“run”,脚本运行良好。如果我使用 ' sh run.sh'从命令行运行脚本,它工作正常。

任何想法,甚至只是如何调试它实际试图运行的路径?

Mic*_*mer 7

根据桌面输入规范

不能在带引号的参数中使用域代码

因此,你%k的字面意思是bash命令。将该Exec行更改为以下内容可避免这样做:

Exec=bash -c '"$(dirname "$1")"/run.sh' dummy %k
Run Code Online (Sandbox Code Playgroud)

以上在本地有效,如果路径中有空格也有效。dummy被赋予bash脚本作为它的$0(它认为脚本名称是什么),并且它%k的扩展可以作为$1. 引用的嵌套层是必要的,以符合规范并且是空间安全的。

请注意,%k它不一定会扩展到本地文件路径——它可以是一个 vfolder URI,也可以是空的,一个真正可移植的脚本也应该考虑到这些情况。%k本身也没有得到普遍支持,因此无论如何您都需要对希望使用它的系统进行一些限制。


就调试而言,您可以在 KDE 下使用普通的 shell 重定向:

Exec=bash -c ... > /tmp/desktop.log
Run Code Online (Sandbox Code Playgroud)

这不是标准化的行为,它在 GNOME 和其他可能的情况下不起作用。您还可以为精心制作的脚本提供绝对路径,以按照您需要的方式记录其参数和操作。