我正在尝试创建一个桌面快捷方式,该快捷方式使用命令行参数启动一个终端应用程序,该命令行参数包含一个文件的路径,文件名中带有一个随机生成的数字。
我已经尝试了所有能想到的方法但仍未找到任何有效的方法。
Exec 行现在的样子如下:
Exec=sudo nwipe --logfile=/home/admin/Documents/nwipe/Certificate{$((1 + $RANDOM % 99999))}.pdf
该行似乎在终端窗口中直接工作正常,但当我尝试启动桌面快捷方式时却不行。
我不太熟悉终端和 bash,但在 PowerShell 中我会做如下操作:
sudo nwipe --logfile=/home/admin/Documents/nwipe/Certificate$(Get-Random -Maximum 99999).pdf
这是因为在终端窗口中,您与解释您使用的这个文件的 shell 进行交互。桌面文件中的密钥
$((…))
不会被Exec
shell 解释。只有一些解析会像 shell 所做的那样完成(例如拆分为单词)。如果想要
$((…))
像在 shell 中一样展开,则需要运行 shell。您标记了bash,并且您使用的语法在 中有效bash
,但不一定在 中有效sh
,因此您需要运行bash
。至少有两种方法:将您的命令放入具有正确 shebang 的可执行脚本中,然后让桌面文件运行该脚本。
bash -c …
或者直接从密钥运行Exec
,使用特定于密钥的语法(尤其是引用规则):这导致以下结果:
笔记:
exec sudo …
处理完该部分后,make 会用bash
替换自身。关键是我们不需要保留 的父级。(我认为 Bash 可能会进行优化,即使我们没有使用显式;,它也可能会用 替换自身,也可能不会。使用显式的话,这一点毫无疑问。)最终,它就像您直接从桌面文件(即)运行一样。sudo
$((…))
bash
sudo
sudo
exec
exec
sudo
Exec=sudo …
--logfile=…
代码片段在 shell 代码中都是双引号。在这种情况下,额外的引号并不是必需的(除非您的代码$IFS
很奇怪),但一般来说它们应该在那里。将它们视为如何正确转义双引号的示例,我们的代码应该会看到这些示例bash -c
。$((…))
在像 这样的字符串中varname
,将其展开为,这也$varname
适用于。少了一个转义符。RANDOM
$
Terminal=yes
桌面文件。my-special-bash
,但如果您需要添加位置参数,那么应该有一些内容。一般注意事项:
$RANDOM
0
在 Bash 中, 扩展为和之间的随机整数32767
,因此$RANDOM % 99999
等同于$RANDOM
,99999
太大了以至于无法产生差异。我的回答并没有解决这个问题;我决定展示如何正确地转义此语法,以防有人想使用较小的数字,而使用%
实际上才是有意义的。