我有一个为 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
,那可能是一个解决方案。或者也许有一个可以使用的 bash 命令,例如sed
或tee
?基本上,我只想要一个 Exec 行,它将捕获带有空格的文件名,argv[1]
并且仍然允许 stderr 重定向到一个文件。
答案1
您可以将%f
参数作为位置参数传递给 shell,方法是将其放在命令字符串后面,然后以通常的方式在命令字符串内引用它。
前任。
Exec=sh -c 'somecommand "$1" 2>> /path/to/stderr.log' sh %f
此技术甚至适用于 %F 多文件占位符:
Exec=sh -c 'somecommand "$@" 2>> /path/to/stderr.log' sh %F
我在这里使用sh
not bash
,因为您的命令似乎没有任何特定于 bash 的内容,但是同样的情况也适用于bash
:
-c If the -c option is present, then commands are read from the
first non-option argument command_string. If there are argu‐
ments after the command_string, the first argument is
assigned to $0 and any remaining arguments are assigned to
the positional parameters. The assignment to $0 sets the
name of the shell, which is used in warning and error mes‐
sages.