.desktop 文件 Exec 路径中的空格

.desktop 文件 Exec 路径中的空格

我正在尝试创建一个 .desktop 文件,该文件运行与 .desktop 文件位于同一文件夹中的 shell 脚本。到目前为止,我已经完成了以下工作:

Exec=bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'

该命令只有两个问题。第一个问题是desktop-file-validate返回一堆错误:

start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character ''' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a non-escaped character '$' in a quote, but it should be escaped with two backslashes ("\\$")
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character '&' outside of a quote
start.desktop: error: value "bash -xc 'cd "$(dirname %k)" && bash ./patch.sh && bash -c "read -n1"'" for key "Exec" in group "Desktop Entry" contains a reserved character ''' outside of a quote

这些我都不明白。整个“bash”参数周围有单引号,其中所有内容都使用双引号。桌面文件可以工作,bash 命令本身(在桌面文件之外运行时)也可以工作,那么为什么这个验证工具会抱怨缺少引号呢?为什么我需要&&在脚本中转义?

第二个问题是,如果桌面文件的路径包含空格,则桌面文件将不起作用。我相信这可能与验证器给我的所有错误有关。

但我完全不知道如何正确地逃避这一切以使错误消失。转义已经在单引号内的 that 是没有意义的&&,不是吗?

答案1

我不明白这些

如果我们仔细阅读错误,我们可以将其减少为:

error: value "bash -xc '...'" contains a reserved character ' outside of a quote

'它告诉我们如果不先引用它就不能使用它。一种选择可能是对所有内容都加双引号。在这种情况下,内部双引号可能需要转义。另一个选项是转义单引号,以便将其视为行的一部分而不是特殊运算符。

我怀疑其中之一会起作用:

Exec=bash -xc \'cd \"\$(dirname %k)\" \&\& bash ./patch.sh \&\& bash -c \"read -n1\"\'
Exec="bash -xc 'cd \"$(dirname %k)\" \&& bash ./patch.sh && bash -c \"read -n1\"'"

&&为什么我需要在脚本中转义?

&&是一个 bash 操作符。无论解析这一行的是什么,都不是 bash。相反,它可能只是获取该行,对其进行预处理(扫描用户可能希望该应用程序知道的任何特定内容),对其余部分进行标记,然后使用第一个标记启动一个进程,并将其余部分作为参数传递。它可能有自己特殊的规则和语法。

答案2

请参阅规格。这很复杂。您必须引用具有保留字符(很长的列表)的参数,但是仅使用双引号。因此,您的命令当前实际上'cd作为第二个参数传递给bash. Also&&不在双引号内,因此会产生错误。

我不使用 gnome,所以无法测试这个,但规范说你必须转义"`\$字符串内的字符(如果你不想像你一样使用字段代码,则必须转义),所以你可以尝试一些%东西%%喜欢

bash -xc "cd \"\\$(dirname %k)\" && bash ./patch.sh && bash -c \"read -n1\""

该规范可以提供一些具体的、重要的示例。

相关内容