*.desktop 和符号链接都不起作用(仅适用于这一个文件) - Linux Mint 17.2 Cinnamon

*.desktop 和符号链接都不起作用(仅适用于这一个文件) - Linux Mint 17.2 Cinnamon

我有这个桌面条目:

[Desktop Entry]
Name=dummy
Type=Application
Terminal=false
Icon=/home/xyz/Software/Test/ico.png
Exec= /home/xyz/Software/Test/start

它应该执行包含以下内容的文件:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./Linux/lib 
exec ./foo --gc=sgen

我尝试创建符号链接,但结果是相同的 - 它什么也没做。当我双击文件夹中的文件时,它会给我这样的提示:

http://1.bp.blogspot.com/-hfJadnx7lM8/T_qkxu6wanI/AAAAAAAABtM/TBiFSfVzJeg/s1600/2012-07-09-162344_514x187_scrot.png

单击后Run,它运行正常,但是从桌面执行时......

我已经尝试将此路径导出到 PATH,但是在运行时foo,它找不到一些库,即使它应该......而且路径是 100% 正确的,因为图标按其应有的方式显示。

我想做的是创建start文件或foo文件的工作桌面快捷方式(由于某种原因,它不会在没有错误的情况下执行,我已将其路径添加到 PATH,执行时可能缺少参数“--gc=sgen”?)

任何帮助将不胜感激!

答案1

问题是您在脚本中使用相对路径:./Linux/lib, ./foo。这些路径是相对于当前目录的。运行脚本的进程的当前目录是启动它的任何进程的当前目录;它与脚本的位置无关。当您通过单击桌面图标运行脚本时,当前目录是您的主目录。

cd一种解决方案是在脚本中添加一条命令,以更改到安装应用程序的目录。

#!/bin/sh
cd /home/xyz/Software/Test/
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:./Linux/lib"
exec ./foo --gc=sgen

但不更改当前目录,而是使用绝对路径会更有用。例如,这样您就可以使用脚本打开当前目录中的文件。当我这样做时,我添加了"$@"的调用foo,它将脚本命令行上的参数传递到应用程序。

#!/bin/sh
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/xyz/Software/Test/Linux/lib"
exec /home/xyz/Software/Test/foo --gc=sgen "$@"

如果脚本位于应用程序目录中,您可以让它检测自己的位置。$0是脚本的路径。${0%/*}是脚本的路径,其中最后一个斜杠之后的所有内容都被删除,即包含脚本的目录的路径。

#!/bin/sh
foo_directory="${0%/*}"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
exec "$foo_directory/foo" --gc=sgen "$@"

请注意,如果LD_LIBRARY_PATH最初为空,则您将添加当前目录,这可能不是一个好主意。你应该测试一下。

#!/bin/sh
foo_directory="${0%/*}"
if [ -n "$LD_LIBRARY_PATH" ]; then
  export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
else
  export LD_LIBRARY_PATH="$foo_directory/lib"
fi
exec "$foo_directory/foo" --gc=sgen "$@"

或(假设您不使用 中的空条目LD_LIBRARY_PATH,这是一个明智的选择)

#!/bin/sh
foo_directory="${0%/*}"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
LD_LIBRARY_PATH="${LD_LIBRARY_PATH#:}"
exec "$foo_directory/foo" --gc=sgen "$@"

相关内容