我有一个复杂的快捷方式/启动器,我想将其放入打开方式列表中。快捷方式使用命令
screen -d -m bash -c "screen;source /home/me/intel/bin/compilervars.sh intel64;/home/me/QtCreator/QtCreator2.8.1-gcc/bin/qtcreator"
它之所以这么复杂是因为它必须执行英特尔编译器的脚本。我尝试将命令更改为
screen -d -m bash -c "screen;source /home/me/intel/bin/compilervars.sh intel64;/home/me/QtCreator/QtCreator2.8.1-gcc/bin/qtcreator %F"
然后将 QtCreator.desktop 文件复制到 /use/share/applications/,但没有作用。
我该怎么办?我阅读了很多关于此的教程,但我认为这个奇怪的启动器命令有一个特殊情况。
谢谢。
答案1
解决方案
您的桌面条目中的行值Exec
应如下所示:
screen -d -m bash -c "screen;source /home/me/intel/bin/compilervars.sh intel64;/home/me/QtCreator/QtCreator2.8.1-gcc/bin/qtcreator \"\$@\"" dummy %F
screen;
顺便问一下:为什么在 bash 命令字符串的开头有?如果我没记错的话,那应该没有必要。
我还应该提到,我已经使用以下Exec
命令成功测试了这一点,因为我这里没有 QtCreator:
screen -d -m bash -c "libreoffice --writer \"\$@\"" dummy %F
解释
由于这里涉及很多“层次”,因此有点难以
- 正确地将参数从启动器传递给 QtCreator。
- 得到正确的引用。
让我们从第一个问题开始:您不能在启动器的命令%F
中使用参数(即在引号内) ,请参阅Exec
此规格页的最后一行其中写道:
%F 和 %U 字段代码只能单独用作参数。
因此,您必然会将启动器参数(即%F
)作为最外层“层”上的参数。但您想将它们放入小 bash 命令中。幸运的是,bash 将其-c
选项的第一个参数之后的所有参数用作位置参数。不幸的是,bash 从 0 开始对它们进行编号,即它使用$0
、$1
、$2
等。因此,您不能$@
在脚本中使用 访问它们所有,因为$0
那样的话您会错过第一个( )参数。这就是我添加参数的原因dummy
:它始终被分配给 ,$0
在我们的例子中从未使用过。所有真实参数(即%F
)都完全传递到$@
。
太好了,我们解决了第一个问题:我们设法将所有命令行参数从启动器放入小 bash 命令中。
现在来谈谈引用的问题。bash 命令周围的双引号由启动器解释。因此,这些引号之间的所有内容都必须遵守桌面入口规范在普通的 bash 脚本中,(缩短的)调用将如下所示:
qtcreator "$@"
因为每个参数都可以包含空格,所以我们必须用引号括住$@
变量。现在,Exec
关键规范要求(除其他外),如果在双引号内使用双引号和美元符号,则需要用引号括住它们 - 这正是我们所做的。第二个问题也解决了。