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

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

我试图让 .desktop 文件运行 .sh,该文件存储在与 .desktop 相同的目录中。整个目录需要可移植并可以从一台机器移动到另一台机器。

我的运行脚本是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;"

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

有什么想法,甚至我如何调试它实际尝试运行的路径?

答案1

根据桌面入门规格:

字段代码不得在带引号的参数内使用

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

Exec=bash -c '"$(dirname "$1")"/run.sh' dummy %k

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

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


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

Exec=bash -c ... > /tmp/desktop.log

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

答案2

如果脚本与文件位于同一目录中.desktop,则只需使用相对路径。没有理由摆弄bash -c或修改你的$PATH,更不用说dirname

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
Exec=./run.sh

只要您的文件run.sh与文件位于同一目录中.desktop并且具有正确的 shebang 行:

#!/usr/bin/env bash

它应该可以在任何地方工作。使用#!/usr/bin/env bash而不是#!/bin/bash确保将使用bash用户中的任何一个$PATH,并使您的脚本完全可移植。


笔记:@迈克尔霍默指出在评论中,相对路径不适用于所有桌面环境。我在 Cinnamon 上尝试过,它按预期工作,因此,想必它也应该适用于其他基于 Gnome 的环境。 freedesktop.org 规范似乎建议应使用完整路径:

Exec 键必须包含命令行。命令行由一个可执行程序(可选地后跟一个或多个参数)组成。可执行程序可以使用其完整路径或仅使用可执行文件的名称来指定。如果未提供完整路径,则会在桌面环境使用的 $PATH 环境变量中查找可执行文件。可执行程序的名称或路径不能包含等号(“=”)。参数之间用空格分隔。

答案3

正如中提到的桌面入门规格%k其他字段代码不得在带引号的参数内使用。但是,有一些方法可以将带有空格的表达式复制到变量而不使用引号:

Exec=k=$(echo %k) && "$(dirname "$k")"/run.sh

答案4

一种运行具有相对于 .desktop 文件父目录的路径的程序(此处提供了 bash 脚本,但它可以适用于任何其他程序)的方法(在GnomeKDEXfceLXDELXQtMATECinnamonBudgie桌面环境中测试) :

侏儒:

Exec=gnome-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

侏儒 - 较新:

Exec=gnome-terminal -- bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'

关键DE:

Exec=konsole -e "bash -c 'cd $(printf '"%s"' "$(dirname "%k")"); bash "./relative_file_path.sh" parameter1 parameterN'"

Xfce:

Exec=xfce4-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

LXDE:

Exec=bash -c 'cd "%k"&&bash "./relative_file_path.sh" parameter1 parameterN'

LXQt:

Exec=bash -c 'cd "%k"&&bash "./relative_file_path.sh" parameter1 parameterN'

伴侣:

Exec=mate-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

肉桂:

Exec=gnome-terminal -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

虎皮鹦鹉:

Exec=tilix -e "bash -c 'cd \"$(dirname "\"%k\"")\"; bash "./relative_file_path.sh" parameter1 parameterN'"

上面显示的代码的 .desktop 文件示例Exec(除了LXDELXQt- 替换为Terminal=falseTerminal=true

[Desktop Entry]
Version=1.0
Name=Name to display
Comment=A comment
Exec=...
Icon=utilities-terminal
Terminal=false //does not show the initial launcher app (terminal) window
Type=Application
Categories=Application;

对于 python3,替换bash "./relative_file_path.sh" parameter1 parameterNpython3 "./file_content_search.py" parameter1 parameterN, 或 - 对于其他程序,根据需要替换

相关内容