我试图让 .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 脚本,但它可以适用于任何其他程序)的方法(在Gnome
、KDE
、Xfce
、LXDE
、LXQt
、MATE
、Cinnamon
、Budgie
桌面环境中测试) :
侏儒:
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
(除了LXDE
和LXQt
- 替换为Terminal=false
)Terminal=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 parameterN
为python3 "./file_content_search.py" parameter1 parameterN
, 或 - 对于其他程序,根据需要替换