我有一个我创建的 GTK 应用程序的桌面文件,它具有以下结构:
[Desktop Entry]
Version=1.0
Name=My GTK Application
Comment=Desktop File
Exec=bash -c 'sudo taskset -c 6 /home/user_name/path/to/app/./executable %f 2>> /home/user_name/path/to/app/LogFiles/stderr.log'
Icon=/home/user_name/path/to/app/Images/icon.png
Terminal=false
Type=Application
Categories=Utility;Application;
MimeType=application/x-myapp;
Name[en_US]=GTK Application
如您所见,我与应用程序有一个 mime 类型关联,因此可以双击并在应用程序中打开具有正确扩展名的文件。文件的绝对路径作为命令行参数传递,应用程序(用 C 编写)捕获argv[1]
(当它不为 NULL 时)并使用它打开文件。问题是当文件名中有空格时,这会失败。我原来的 Exec 行很简单:
Exec=sudo taskset -c 6 /home/user_name/path/to/app/./executable
因为我没有尝试将 stderr 重定向到日志文件。使用这个 exec 行,我不需要%f
在行上以便 C 程序抓取argv[1]
,并且带有空格的文件名不是问题。我发现在 Exec 行上重定向 stderr 仅在我使用时才有效bash -c
,根据手册页,“从字符串执行命令”。现在除非使用,否则我无法捕获文件%f
,但是当文件名中有空格时它会失败。我尝试过使用单引号、双引号和其他东西的无穷组合,但无济于事。我知道有两种解决方法:(1) 我可以让 Exec 行改为执行脚本,或者 (2) 如果我%F
改为使用,则文件名的所有部分都将传递给argv[2], argv[3]
等等,取决于文件名中空格的数量。然后我只需要使用argc[]
并循环来捕获所有将argv[]
所有内容重新连接到实际文件名中。这些选项似乎都没有说服力。必须有一个更好的方法,我错过了。如果有一种方法可以在没有 的情况下重定向 stderr bash -c
,那可能是一个解决方案。或者也许有一个类似sed
或tee
可以使用的bash命令?基本上,我只想要一个 Exec 行,它将捕获带有空格的文件名argv[1]
并仍然允许 stderr 重定向到文件。
您可以将
%f
参数作为位置参数传递给 shell,方法是将其放在命令字符串之后,并以通常的方式在命令字符串中引用它。前任。
这种技术甚至适用于 %F 多文件占位符:
我
sh
没有bash
在这里使用,因为您的命令似乎没有任何特定于 bash 的内容,但同样适用于bash
: