在 .desktop 文件中运行分成多行的长命令?

在 .desktop 文件中运行分成多行的长命令?

假设我们有这个文件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

相关内容