如何通过启动器中存储的bash命令获取Linux Mint LMDE5下启动器的路径?

如何通过启动器中存储的bash命令获取Linux Mint LMDE5下启动器的路径?

Linux Mint LMDE5 是 Debian 的衍生版本。在桌面上,您可以通过 GUI 创建启动器 pe,您不仅可以链接某些内容,还可以在其中存储较小的 bash 代码。创建后,启动器可以移动到其他文件夹。

以下 .sh 文件和启动器的位置:

/home/user_name/desktop/a/b/c

使用以下代码,您可以在执行时打印 bash 文件的路径。

.sh文件的内容:

#!/bin/bash
script_path=$(dirname "$(readlink -f "$0")")"/"
echo "$script_path"
sleep 100

.sh 文件的输出:

/home/user_name/desktop/a/b/c

不工作的启动器“解决方案”:

启动器文件的内容:

bash -c 'launcher_path=$(dirname "$(readlink -f "$0")")"/"; echo "$launcher_path"; sleep 100'

终端启动器的输出:

/home/user_name/ # but that should be: /home/user_name/desktop/a/b/c

“启动器”是什么意思:

这是一个 .desktop 文件,在 Linux Mint 和 LMDE 上很常见。该文件在结构和任务上与 Windows 下的“.lnk”文件相似。

通过 Linux Mint GUI 创建“启动器”的两个方法:

“启动器”的示例内容(.desktop 文件):

[Desktop Entry]
Name=test
Exec=bash -c 'xed /home/user/desktop/sample_file.txt'
Comment=
Terminal=true
Icon=cinnamon-panel-launcher
Type=Application
Name[de_DE]=Sample for a launcher file, which open a textfile, which is located on desktop.

具体化:

仅搜索启动器以下命令行的适当修改:

bash -c 'launcher_path=$(dirname "$(readlink -f "$0")")"/"; echo "$launcher_path"; sleep 100'

它不寻找任何额外的脚本或操作系统的修改。

答案1

如果您想知道包含运行脚本的目录,则不应使用bash -c,而是可以将脚本符号链接到包含可执行文件(通常为~/.local/bin~/bin)的用户拥有的目录,并使用它作为文件Exec的密钥.desktop。由于您使用的是 Bash,您还可以替换$0为更好的替代方案${BASH_SOURCE[0]}。 (看回答)

$ pwd
/home/user_name/desktop/a/b/c
$ cat mylauncher.sh
#!/bin/bash
script_path=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/
echo "$script_path"
$ ./mylauncher.sh
/home/user_name/desktop/a/b/c/

将符号链接添加到~/bin

$ pwd
/home/user_name/desktop/a/b/c
$ mkdir -p ~/bin
$ PATH=$HOME/bin:$PATH
$ ln -rs ./mylauncher.sh ~/bin
$ cd
$ pwd
/home/user_name
$ mylauncher.sh
/home/user_name/desktop/a/b/c/

现在您可以Exec=mylauncher.sh在您的文件中使用.desktop。有些系统已经在文件中包含了对~/bin和 的检查。如果没有,您可以将其添加到其中:~/.local/bin.profile

if [ -d "$HOME/bin" ]; then
    PATH=$HOME/bin:$PATH
fi

if [ -d "$HOME/.local/bin" ]; then
    PATH=$HOME/.local/bin:$PATH
fi

GNUln支持-r允许轻松使用相对路径的选项。看ln(1)


另一种选择是使用设置%k中的特殊字段Exec作为参数。该字段扩展到运行文件的位置.desktop。请注意,根据规格它可以是 URI 或路径。

[Desktop Entry]
Version=1.0
Name=Test
Exec=bash -c 'desktop_file=${1#*://}; dir=$(dirname "$(readlink -f "$desktop_file")"); echo "$dir"; sleep 1000' -- %k
Terminal=true
Type=Application

${1#*://}剥离协议部分以防%k扩展为file://URI。

相关内容