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。