使用gnome-terminal的桌面应用程序:脚本和图标的相对路径。

9
我正在使用 gnome-terminal 创建一个可点击的桌面应用程序。该应用程序应以 zip 文件形式下载,其中包含一个名为 bin 的子目录,其中包含我的 myapp.desktop 文件。 我希望在我的 zip 文件中有一个名为 somedir 的不同目录,其中包含主应用程序脚本和应用程序图标。
然而,gnome-terminal 似乎无法使用相对路径。这是我的 myapp.desktop 文件:
[Desktop Entry]
Exec=gnome-terminal -e "bash -c -i 'exec $SHELL --init-file ../somedir/myscript.sh'"
Icon=../somedir/myicon.gif
Terminal=true
Type=Application

我的问题是:我如何将应用程序图标被点击时的目录传递给 gnome-desktop?或者我该如何组织我的目录,以便我不必像在 myapp.desktop 目录中一样拥有 myicon.gifmyscript.sh
我知道 --working-directory 参数可以用于 gnome-terminal,并尝试传递 $PWD,但没有成功。
编辑:
相关问题:Python脚本的桌面启动器在错误的路径中启动程序(Linux)
路径可以在 .desktop 文件中指定,但似乎无法处理相对路径。如果我添加 Path=.,它会找不到。

2
这不是一个gnome-terminal的问题,而是一个.desktop启动器的问题。问题是启动器提供了关于被启动的.desktop文件的哪些信息给生成的进程,并且它可以作为变量等用于.desktop文件中。我猜答案对你来说并没有太多有用的东西。 - Etan Reisner
对于图标,我同意,这是一个 .desktop 启动器问题。但是,即使我没有使用启动器执行上面的 gnome-terminal 命令,它只能在我的 myscript.shmyapp.desktop 相同的目录中或者给出绝对路径时才能找到我的 --init-file - user1981275
调用带有初始化文件的shell,例如bash --init-file ../somedir/myscript.sh可以正常工作,但在gnome-terminal中似乎无法正确工作。 - user1981275
路径是相对于使用它们的工作目录的。当你输入 myscript.sh 时,它会在尝试使用该路径的进程的当前工作目录中查找 myscript.sh。我不知道启动器在执行你的 gnome-terminal 进程时将使用哪个工作目录。它可能使用 .desktop 文件的位置。它可能使用你的主目录。它可能使用 /。或者它可能使用其他任何内容。 - Etan Reisner
是的,我认为路径是相对于我的主目录,这不是我想要的... 在OSX中,我成功地在可点击的bash脚本中调用了cd -- "$(dirname "$0")",但我还没有在Ubuntu的启动器中让它工作。 - user1981275
2
你的方法似乎是反向的。路径标准化有非常好的原因,所有流行的发行版都有包管理系统也有很好的理由。应根据你的目标受众的标准打包你的工具。 - tripleee
3个回答

5
基于这个文档和ask ubuntu上的其他答案(例如这个这个),我认为您不能直接在桌面应用程序中使用相对路径。
然而,您可以将文件保存在所需的文件夹中,并在软件包中包含一个配置脚本,该脚本会将可执行文件和图标复制到默认路径中,如文档所述($PATH表示可执行文件的路径,/usr/share/pixmaps表示图标的路径)。
此外,在这里有一个不错的解决方法。在这里有一个类似于我提出的解决方案。
似乎每个人都同意不能使用相对路径,但是……
……搜索更多信息后,似乎有可能以家目录作为相对路径的起点,只需在路径前省略正斜杠即可。基于这个页面(链接),这样做:
  Exec="${HOME}/bin/scripts/UNIX/Prototype.bash"
  Path=${HOME}/bin/scripts/UNIX

无法使用

但是这个:

  Exec="Prototype.bash"
  Path=bin/scripts/UNIX

应该。


可能存在启动器运行的环境不在您的主目录中的情况,但作为一种快速且简单的方法,这有一些潜力。 - tripleee

2

这种方法不起作用,因为.desktop文件中的$PWD指向主目录。所以你应该创建一个安装脚本来生成“myapp.desktop”,并将“myapp.desktop”和“icon.png”都复制到特定的目录中。将此脚本复制到您的应用程序根目录,并运行它!

install.sh

#!/bin/bash

home_local=$HOME/.local/share
icon_dir=$home_local/icons/hicolor/48x48/apps

myapp_desktop=$home_local/applications/myapp.desktop
myapp_dir=$PWD
myapp=$myapp_dir/bin/myapp.sh
myapp_icons=$myapp_dir/icons/myapp.png

echo "[Desktop Entry]" > $myapp_desktop
echo "Name=MyApp" >> $myapp_desktop
echo "Exec=bash -c 'cd $myapp_dir;bash $myapp;exec bash'" >> $myapp_desktop
echo "Icon=myapp.png" >> $myapp_desktop
echo "Terminal=true" >> $myapp_desktop
echo "Type=Application" >> $myapp_desktop

cp $myapp_icon $icons_dir 

你和@terence hill的解决方案看起来非常有前途,但由于我没有带X的Ubuntu机器,所以无法在假期测试它。 - user1981275

1
让Exec看起来像这样:
Exec=gnome-terminal -e "bash -c -i 'set > /tmp/env_vars.log'"

然后检查日志文件中可用的变量(例如,它从哪里运行),并相应地调整您的相对路径。如果没有有用的信息,可以使用一些现有变量上的dirname来推导完整路径等。

您也可以这样运行:

Exec=gnome-terminal -e "bash -c -i 'pwd' > /tmp/curdir.log"

并使用curdir.log中找到的路径作为相对路径。

我应该在日志文件中从哪里找到脚本启动时的信息? 我搜索了“launcher”和“gnome-terminal”,但没有发现任何内容。 - user1981275
2
日志仅包含您的命令生成的精确输出。set 命令只是简单地打印您的环境,但在 Bash 下包括 PWD 的值。您可以在日志中包含 datepwd 和其他命令,以使其更有用。然而,这对于快速连续启动多个实例并不稳健。 - tripleee
这不起作用,此时的$PWD是我的主目录而不是我启动启动器的目录... - user1981275

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接