假设我们有这个文件start-term-tabs.sh
:
gnome-terminal \
--tab --title="Term 1" \
--working-directory=/tmp \
-e "bash -i" \
--tab-with-profile=Default --title="Term 2" \
--working-directory=/home \
-e "bash -i" \
--tab-with-profile=Default --title="Term 3" \
--working-directory=/etc \
-e "bash -i"
因为这是一个很长的命令,并且出于可读性的原因,我喜欢将其分成多行,通过在每行上转义换行符。通过这样做chmod +x start-term-tabs.sh
,我可以双击start-term-tabs.sh
桌面上的,它将启动,但它会显示非常烦人的“您想运行“start-term-tabs.desktop”,还是显示其内容?”:
...每次我都必须单击“运行”。
现在,我可以创建test.desktop
如下文件:
[Desktop Entry]
Name=start-term-tabs test
Terminal=false
Type=Application
Icon=/usr/share/app-install/icons/terminal-tango.svg
Exec=/home/USER/Desktop/start-term-tabs.sh
... 完成后chmod +x test.desktop
,一切都运行;但随后我必须管理二文件,而我只想管理一个文件。
因此,我尝试将整个上述gnome-terminal
命令行塞进其中,当它作为 Exec 字段中的一行时:
Exec=gnome-terminal --tab --title="Term 1" --working-directory=/tmp -e "bash -i" --tab-with-profile=Default --title="Term 2" --working-directory=/home -e "bash -i" --tab-with-profile=Default --title="Term 3" --working-directory=/etc -e "bash -i"
...它确实也能正常工作,但是当它只有一行时,我很难管理它。
但是当我尝试在 .desktop 文件内拆分它时,情况是:
[Desktop Entry]
Name=start-term-tabs test
Terminal=false
Type=Application
Icon=/usr/share/app-install/icons/terminal-tango.svg
Exec=gnome-terminal \
--tab --title="Term 1" \
--working-directory=/tmp \
-e "bash -i" \
--tab-with-profile=Default --title="Term 2" \
--working-directory=/home \
-e "bash -i" \
--tab-with-profile=Default --title="Term 3" \
--working-directory=/etc \
-e "bash -i"
...然后,当我保存它时,图标就不再显示在.desktop 文件上,而是开始看起来像这样:
...因此它不被视为有效的 .desktop 文件,因此当双击它时,我再次收到“您要运行......”提示,即使我说运行,也没有启动 gnome-terminal,所以这里出现了一些可怕的情况。
那么,我怎样才能将 .desktop 文件中 Exec 字段的长命令分成多行(可能使用某种转义)并使其正常运行?
我见过https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#exec-variables,并且我尝试过\\
在各处使用而不仅仅是\
,但这没有帮助 - 否则我无法知道我应该做些什么才能让它工作......
答案1
我有一个超级技巧,涉及将 bash 变量设置为要运行的脚本的内容,然后将其回显到 .desktop 文件中。阅读我的具体脚本的详细信息,但要注意引号和分号。该技巧将程序编码为 shell 变量,然后使用 echo 将所有换行符折叠成一行并将其附加到 Gnome 桌面启动器文件中。
就上下文而言,我有一个名为 Win10.desktop 的文件,它连接到无头 VirtualBox 实例;它根据笔记本电脑是停靠还是独立重新配置网络适配器。我在 RHEL 7.6 / Gnome 3 上。
(我本可以编写不带空格的脚本,但这样很难阅读。我将原始脚本保存在其他地方的 README_REINSTALL 文件中,以防我的系统被破坏而不得不从头开始重新创建它。)
PROG='
PATH=/usr/lib/virtualbox:/usr/bin:bin ;
VM="{045c7bf0-555e-4675-b95c-f8814d689077}" ;
WNIC="wlo1" ;
DNIC="enp58s0u1u2" ;
VMNAME="Win10" ;
ACTION=$(zenity --list --text "Choose action for $VMNAME" --radiolist --column "" --column ""
--hide-header
TRUE "Full GUI Start/Resume"
FALSE "Suspend") ;
case $ACTION in
Full*)
echo "Starting" ;
grep -q $DNIC /proc/net/dev && vboxmanage modifyvm $VM --bridgeadapter1 $DNIC ||
vboxmanage modifyvm $VM --bridgeadapter1 $WNIC ;
exec vboxmanage startvm $VM --type gui
;;
Suspend*)
echo "Suspending" ;
vboxmanage modifyvm $VM --bridgeadapter1 $WNIC ;
exec vboxmanage controlvm $VM savestate
;;
esac'
echo Exec=/usr/bin/bash -c \'$PROG\' >> Win10.desktop